C# - 如何使方法仅对继承方法基类的类可见

时间:2010-11-16 17:00:20

标签: c# methods abstract-class

我有一个标记为抽象的基类。是否可以使该基类中的方法仅对继承基类的其他类可见?

假设我的Class1是我的基类,并标记为抽象。 Class2继承Class1并可以调用它的所有公共方法。我希望Class3创建一个Class2实例,但不能调用Class1的某些方法。我尝试将这些方法标记为抽象,但是当Class2尝试使用它们时我得到了一个错误。错误是:“......无法声明正文,因为它被标记为抽象”

5 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:5)

听起来您正在寻找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
  }
}

答案 2 :(得分:4)

您需要在Class1和Class2中将它们标记为protected。此访问修饰符允许派生类访问成员,但派生类之外的任何内容都不能看到它。

答案 3 :(得分:1)

使用protected关键字。

答案 4 :(得分:1)

我想你想要一个protected abstract方法/属性/字段。但是,您必须使用Class2中的override关键字来实现它。这使得Class2可以访问该字段(如果你真的希望它是抽象的),但不会给任何不继承class1访问这些字段的类。

override可以让您找到Cannot declare a body...消息。