2011-10-12 40 views
1

我试图扩展一个类,然后使用基类中的方法,但是我看不到它。在派生类中看不到父级的方法

我的代码:

class A { 
    protected void Foo(){} 
} 

class B : A {} 

class C{ 
    void Bar(){ 
     B b = new B(); 
     b.Foo(); 
    } 
} 

我怎么能在C使用b.Foo?

+0

“C”从'A'继承吗?如果是这样,代码*仍然*不会编译。有关为什么的文章,请参阅http://blogs.msdn.com/b/ericlippert/archive/tags/protected/。 – dlev

回答

1

你不行。 Foo是A类的受保护成员函数,因此只能在A类内使用,或者从类中继承使用。

class A 
{ 
    protected int x() {} 
} 

class B : A 
{ 
    void F() 
    { 
     A a = new A(); 
     B b = new B(); 
     a.x(); // Error 
     b.x(); // OK 
    } 
} 
+0

在您的示例中不会出现“b.x();''产生错误? – CheeseSucker

+0

那么,实际上我想用2个变量来扩展System.Windows.Shapes.Line。真正的代码: 公共类边缘:行 { <我的变量> 公共边缘(....) { .... }} 但是当我使用它,我可以即使他们公开,也不会看到它的方法或领域。 – gberes

+1

你会想!但是这其实很好。同一类中的类的实例化具有这样的特权。 – ZacAttack

0

您必须公开方法Foo

class A { 
    public void Foo() {} 
} 

class B : A {} 

class C { 
    void Bar(){ 
     B b = new B(); 
     b.Foo(); // Works 
    } 
} 
+0

无论谁,为什么downvote? (已用+1加以抵消!) – Reddog

1

您只能从子类中看到protected方法。

C不从B继承,所以根据定义,它不能看到它的保护方法。

0

做成publicFoo()只对A及其派生类(如'B')可见。 C不是派生类A

0

因为Foo被保护,所以除了派生类以外不能看到任何东西。

要揭露它,你需要做的:

class A 
{ 
    protected void Foo(){} 
} 

class B : A 
{ 
    public new void Foo() 
    { 
     base.Foo() 
    } 
} 

其他答案已经触及了这一点,但没有提到使用的关键字的暴露具有相同名称的方法,但不同的辅助功能。

相关问题