2012-05-31 131 views
0

如何在派生類中使用基類的受保護函數?無法訪問C#中派生類中的受保護函數?

public class A 
{ 
    protected void Test() 
    { 
     // some code.... 
    } 
} 

public class B : A 
{ 
    public void Test2() 
    { 
    A obj = new A(); 
    obj.Test(); // error thrown; 
    } 
} 

當我試圖使用基類的測試功能。這是投擲錯誤..

+0

可能的複製http://stackoverflow.com/questions/1836175/c-sharp-protected-members-accessed-via-base-class-variable –

回答

1

這是因爲'A的Test()受保護,這意味着,B將其視爲private

AB繼承,而A含有被保護Test,並不意味着其它的對象可以訪問Test,即使他們從類繼承的事實。

雖然:從A

由於B繼承,B包含私人方法Test()。因此,B可以訪問它自己的Test功能,但這並不意味着B可以訪問ATest功能。

所以:

public class A 
{ 
    protected void Test() 
    { 
     // some code.... 
    } 
} 

public class B : A 
{ 
    public void Test2() 
    { 
    this.Test(); // Will work! 
    } 
} 
1

測試對象A.

的實例中保護就叫

this.Test() 

無需內B.

0

創建對象的受保護的方法僅適用於派生類型。換句話說,你試圖在創建A.

2

的一個實例可以調用Test()方法公開訪問該方法直接而無需創建基本類型的新對象:

public class A 
{ 
    protected void Test() 
    { 
     // some code.... 
    } 
} 

public class B : A 
{ 
    public void Test2() 
    { 
    Test(); // Calls the test method in the base implementation of the CURRENT B object 
    } 
} 
2

我認爲一個能做到這一點,通過在基類中受保護的靜態方法,又不失封裝。

public class A 
{ 
    protected void Test() { /* ... */ } 

    protected static void Test(A obj) 
    { 
    obj.Test(); 
    } 
} 

public class B : A 
{ 
    public void Test2() 
    { 
    A obj = new A(); 
    A.Test(obj); 
    } 
} 

實際上A.Test()只能從派生類和它們的同胞中調用。

一種用於測試片段:http://volatileread.com/utilitylibrary/snippetcompiler?id=37293

相關問題