簡體   English   中英

C# - 如何使方法僅對繼承該方法基類的類可見

[英]C# - How to make a method only visible to classes that inherit the base class of the method

我有一個標記為抽象的基類。 是否可以使該基類中的方法僅對繼承基類的其他類可見?

假設我有 Class1 是我的基類並被標記為抽象。 Class2 繼承 Class1 並且可以調用它的所有公共方法。 我希望 Class3 創建 Class2 的實例,但無法調用 Class1 的某些方法。 我嘗試將這些方法本身標記為抽象方法,但是當 Class2 嘗試使用它們時出現錯誤。 錯誤是:“...無法聲明主體,因為它被標記為抽象”

為什么不聲明方法protected

public abstract class Class1
{
    protected abstract void Method1();
    public abstract void Method2();
}

public class Class2 : Class1
{
    protected override void Method1()
    { 
        //Class3 cannot call this.
    }
  
    public override void Method2()
    {
        //class 3 can call this.
    }
}

public class Class3 
{ 
    public void Method()
    {
        Class2 c2 = new Class2();
        c2.Method1(); //Won't work
        c2.Method2(); //will work
    }
}

聽起來您正在尋找protected關鍵字。 這限制了標記為protected的成員僅用於聲明類型或從該類型派生的類型。

abstract class Class1 {
  protected void Method1() {
    ...
  }
}

class Class2 : Class1 {
  public void Method2() {
    Method1(); // Legal
  }
}

class Class3 { 
  public void Example() {
    Class2 local = new Class2();
    local.Method2();  // Legal
    local.Method1();  // Illegal since Method1 is protected
  }
}

您需要在 Class1 和 Class2 中將它們標記為protected 此訪問修飾符允許派生類訪問成員,但派生類之外的任何人都無法看到它。

使用protected關鍵字。

我認為你想要一個protected abstract方法/屬性/字段。 不過,您必須使用 Class2 中的override關鍵字來實現它。 這使 Class2 可以訪問該字段(如果您真的希望它是抽象的),但不會授予任何不從 class1 繼承的類訪問這些字段的權限。

這是override可以讓您繞過Cannot declare a body...消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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