Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使受保护的成员在;“孙辈”;班_C#_Oop_Inheritance_Protected - Fatal编程技术网

C# 如何使受保护的成员在;“孙辈”;班

C# 如何使受保护的成员在;“孙辈”;班,c#,oop,inheritance,protected,C#,Oop,Inheritance,Protected,我在抽象类AbstractModule中有受保护的变量var1 我从父类AbstractModule创建抽象类AbstractActivity:AbstractModule并使用var1 现在我创建了类MyActivity:AbstractActivity,我想使var1在MyActivity类中不可访问 我怎么做 (我可以创建受保护的属性,但我也有同样的问题)C#不允许这样做。但是,您可以通过创建一个同名字段来隐藏类中的字段AbstractActivity。您的类MyActivity将可以访问

我在抽象类AbstractModule中有受保护的变量
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
定义为其他类型的东西[例如,一个空的静态类]?