2010-11-16 93 views
10

我有一个标记为抽象的基类。是否有可能使该基类中的方法仅对继承基类的其他类可见?C# - 如何使方法只对继承方法的基类的类可见

说我有Class1,这是我的基类,并被标记为抽象。 Class2继承Class1并可以调用它的所有公共方法。我希望Class3创建Class2的实例,但无法调用Class1的某些方法。我试图将这些方法标记为抽象,但是当Class2尝试使用它们时出现错误。错误是:

回答

16
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“因为它被标记为抽象的...不能声明主体”?

+0

正是我在找的东西。我忘了保护!谢谢 – PICyourBrain 2010-11-16 17:05:20

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 
    } 
} 
4

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

1

我想你想要一个protected abstract方法/财产/领域。不过,您必须使用Class 2中的override关键字来实现它。这使Class2可以访问该字段(如果您真的想要它是抽象的),但不会给出任何不能从Class1访问这些字段继承的类。

这是override会让你围绕Cannot declare a body...消息。