[英]is this possible in c# ? only one class access base class method and second class can not access the same base class method
A是基類
B衍生自A,C也衍生自A
我只希望B可以訪問A,C的方法,而不能訪問A的相同方法。
class A {
protected void Foo() {
}
}
class B : A {
void Bar() {
this.Foo(); // OK
}
}
class C : A {
void Baz() {
this.Foo(); // I don't want to permit this
}
}
如何在C#中實現
我認為這看起來像是Interface segregation principle
的問題:
不應強迫客戶端依賴於不使用的接口。
但是在您的情況下,可以將其改寫為類繼承。
創建純基類(沒有要從類C
隱藏的方法)
public class Base
{
protected void SomeDummyMethod()
{
}
}
然后創建A
繼承自Base
A
類,並為B
類添加一個共享的方法
public class A : Base
{
protected void YourFooMethod()
{
}
}
創建從A
繼承的B
類,並且可以訪問所有功能,包括YourFooMethod
public class B : A
{
public void Bar()
{
this.YourFooMethod();
}
}
最后是您的C
類,它具有除YourFooMethod
方法之外的所有基本功能
public class C : Base
{
public void Bar()
{
this.YourFooMethod(); //Compile error: YourFooMethod is not a member of...
}
}
我想您可以在A類中編寫代碼,該代碼對照白名單或黑名單檢查調用類的名稱,並在您要禁止的情況下引發異常,但我不建議這樣做。 這將很難維護,並且A類不需要了解擴展它的每個類。
老實說,您要嘗試執行的操作是個壞主意。
C#(通常是.NET)具有訪問修飾符:
public
-任何人都可以訪問 private
-僅包含作用域/類型可以訪問 protected
僅包含類型及其派生類型可以訪問 internal
-只有在同一程序集(或InternalsVisibleTo
)中定義的類型可以訪問 protected internal
- protected
和internal
可以訪問的集合。 您需要在private
和protected
之間,您可以手動限制對命名類型的訪問。
當前至少在編譯時無法在.NET中強制執行-盡管如果類型A
和B
存在於同一程序集中,而類型C
存在於不同的程序集中,則internal
將起作用。
在運行時,您可以使用代碼訪問安全性或更簡單地實施此操作:使用反射獲取調用類的名稱( this.GetType()
),或使用密碼:
或更簡單:密碼要求:
class A {
private Boolean isAllowedAccess;
protected A(String password) {
this.isAllowedAccess = password == "12345abc";
}
protected void Foo() {
if( !this.isAllowedAccess ) throw new InvalidOperationException();
}
}
class B : A {
public B() : base("12345abc") {
}
void Bar() {
this.Foo(); // OK
}
}
class C : A {
public C() : base(null) {
}
void Baz() {
this.Foo(); // I don't want to permit this
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.