繁体   English   中英

如何使受保护的成员在“孙子”中不可访问 class

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM