簡體   English   中英

這在c#中可能嗎? 只有一個類可以訪問基類方法,而第二個類不能訪問相同的基類方法

[英]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 - protectedinternal可以訪問的集合。

您需要在privateprotected之間,您可以手動限制對命名類型的訪問。

當前至少在編譯時無法在.NET中強制執行-盡管如果類型AB存在於同一程序集中,而類型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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM