不可訪問的抽象類AbstractModule如何使保護成員的「孫子」
創建abstract class AbstractActivity : AbstractModule
並使用var1
從父類AbstractModule
現在我創建class MyActivity : AbstractActivity
我已經受保護的變量var1
我想讓var1
在MyActivity類中無法訪問。
我該怎麼辦?
(我可以創建保護財產,但後來我有同樣的問題)
不可訪問的抽象類AbstractModule如何使保護成員的「孫子」
創建abstract class AbstractActivity : AbstractModule
並使用var1
從父類AbstractModule
現在我創建class MyActivity : AbstractActivity
我已經受保護的變量var1
我想讓var1
在MyActivity類中無法訪問。
我該怎麼辦?
(我可以創建保護財產,但後來我有同樣的問題)
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
}
}
您不能。另一方面,您可以在同一個程序集中使用'AbstractActivity'和'AbstractModule',並在內部創建'var1'。如果您在單獨的程序集中創建了「MyActivity」,則無法訪問「var1」(除了通過反射)。 – Pete
謝謝!我需要在兩個單獨的程序集中... 但是,您對「內部」的建議非常不理想。 – Michael
+1使用陰影來隱藏受保護的成員是icky,但我知道沒有更好的辦法。太糟糕了,沒有一種通用的方法來隱藏派生類中的受保護成員;如果派生類無法正確使用像MemberwiseClone這樣的繼承成員,那麼該成員就不應該暴露給它。 – supercat