2011-10-12 45 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() 
    } 
} 

其他答案已經觸及了這一點,但沒有提到使用的關鍵字的暴露具有相同名稱的方法,但不同的輔助功能。

相關問題