C# 如何使受保护的成员在;“孙辈”;班
我在抽象类AbstractModule中有受保护的变量C# 如何使受保护的成员在;“孙辈”;班,c#,oop,inheritance,protected,C#,Oop,Inheritance,Protected,我在抽象类AbstractModule中有受保护的变量var1 我从父类AbstractModule创建抽象类AbstractActivity:AbstractModule并使用var1 现在我创建了类MyActivity:AbstractActivity,我想使var1在MyActivity类中不可访问 我怎么做 (我可以创建受保护的属性,但我也有同样的问题)C#不允许这样做。但是,您可以通过创建一个同名字段来隐藏类中的字段AbstractActivity。您的类MyActivity将可以访问
var1
我从父类AbstractModule创建抽象类AbstractActivity:AbstractModule
并使用var1
现在我创建了类MyActivity:AbstractActivity
,我想使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
}
}
上面的示例并不阻止编写使用shadow字段的代码。如果程序员知道A.seeMe
并认为它正在设置,则可能会导致混淆。当使用B.seeMe
时,可以通过使用过时属性来强制编译错误:
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
(通过反射除外)。谢谢!我需要在两个单独的组件中使用这个。。。但是你关于“内部”的建议非常令人费解。+1使用阴影来隐藏受保护的成员是令人讨厌的,但我知道没有更好的方法。糟糕的是,没有一种常见的方法可以从派生类中隐藏受保护的成员;如果派生类无法正确使用继承成员(如MemberwiseClone
),则该成员不应暴露于此。谢谢!我知道受保护的新bool seeMe代码>我正在使用这个,但这很难看;)我添加了有关使用过时属性的信息,如果使用阴影,可以强制执行一个错误,从而使该属性更干净。使用[过时(“不能使用seeMe”,错误:true)]
更好@jltrem:如何将seeMe
定义为其他类型的东西[例如,一个空的静态类]?