[英]Does declaring a class protected automatically make its members protected?
[英]How to make protected members not accessible in a "grandchildren" class
我在抽象 class AbstractModule 中有受保护的变量var1
我创建abstract class AbstractActivity: AbstractModule
并使用来自父 class AbstractModule 的var1
现在我创建class MyActivity: AbstractActivity
并且我想让var1
在 MyActivity class 中不可访问。
我该怎么做?
(我可以创建受保护的财产,但后来我遇到了同样的问题)
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
}
}
与上述具有 int 值的解决方案相同的示例。
我试图限制同名孩子 class 中的祖父母字段。
public class MyClass
{
protected int myValue = 10;
}
public class MyClass1 : MyClass
{
protected int myValue = 15;
public MyClass1()
{
base.myValue = 25;
this.myValue = 11;
}
}
public class MyClass2 : MyClass1
{
public void print()
{
Console.WriteLine("My Value : " + myValue);//this will print 11
}
}
class Program
{
static void Main(string[] args)
{
MyClass2 myClass2 = new MyClass2();
myClass2.print();
}
}
//使用 sealed 关键字限制 child class 中的 grand parent 方法
public class MyClass
{
protected virtual void MyMethod()
{
}
}
public class MyClass1 : MyClass
{
// because of sealed method this method will not going to override in derived class.
sealed override protected void MyMethod()
{
}
}
public class MyClass2 : MyClass1
{
protected override void MyMethod()//this will give compiler error
{
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.