2013-10-14 49 views
1

不可訪問的抽象類AbstractModule如何使保護成員的「孫子」

創建abstract class AbstractActivity : AbstractModule並使用var1從父類AbstractModule

現在我創建class MyActivity : AbstractActivity我已經受保護的變量var1我想讓var1在MyActivity類中無法訪問。

我該怎麼辦?

(我可以創建保護財產,但後來我有同樣的問題)

+1

您不能。另一方面,您可以在同一個程序集中使用'AbstractActivity'和'AbstractModule',並在內部創建'var1'。如果您在單獨的程序集中創建了「MyActivity」,則無法訪問「var1」(除了通過反射)。 – Pete

+0

謝謝!我需要在兩個單獨的程序集中... 但是,您對「內部」的建議非常不理想。 – Michael

+0

+1使用陰影來隱藏受保護的成員是icky,但我知道沒有更好的辦法。太糟糕了,沒有一種通用的方法來隱藏派生類中的受保護成員;如果派生類無法正確使用像MemberwiseClone這樣的繼承成員,那麼該成員就不應該暴露給它。 – supercat

回答

2

C#不允許這樣做。但是,您可以通過創建一個具有相同名稱的字段來影響課程AbstractActivity中的字段。然後,您的類MyActivity可以訪問陰影字段及其值,但不能訪問AbstractModule中定義的字段。

public class A 
    { 
    protected bool seeMe; 
    } 

    public class B : A 
    { 
    public B() 
    { 
     base.seeMe = false; // this is A.seeMe 
    } 

    protected bool seeMe; 
    } 

    public class C : B 
    { 
    public C() 
    { 
     seeMe = true; // this is B.seeMe 
    } 
    } 

上面的例子並不妨礙寫入使用陰影字段的代碼。如果程序員知道A.seeMe並認爲它正在設置,這可能會造成混淆。當使用B.seeMe通過使用Obsolete屬性裝飾它時,您可以強制編譯錯誤:

public class B : A 
    { 
    public B() 
    { 
     base.seeMe = false; // this is A.seeMe 
    } 

    [Obsolete("cannot use seeMe", error:true)] 
    protected bool seeMe; 
    } 

    public class C : B 
    { 
    public C() 
    { 
     seeMe = true; // this will give a compile error 
    } 
    } 
+0

謝謝! 我知道'受保護的新布爾seeMe;'和我正在使用這個,但這是醜陋的;) – Michael

+0

我添加了有關使用Obsolete屬性的信息,如果使用陰影,可以通過強制執行一個錯誤來使其更清晰一些。 – jltrem

+1

用'[Obsolete(「不能使用seeMe」,錯誤:true)]'好多了! – Michael