c# - 如何限制受保护的成员只能从第一级子 C# 访问
问题描述
我有3个级别的课程。
TopClass
MiddleClass
BottomClass
和MiddleClass
衍生自TopClass
并且BottomClass
衍生自MiddleClass
。
我想要一个TopClass
只能TopClass
从而MiddleClass
不是BottomClass
.
当我使用protected
访问修饰符时,TopClass
可以从BottomClass
.
这是我的课程,以提供更好的见解。
public class TopClass
{
private string ThisIsOnlyAccessibleForTopClass { get; set; }
protected string ThisIsOnlyAccessibleForTopClassAndMiddleClass { get; set; } // I want this to be accessible only by the MiddleClass
public string AccessibleFromEverywhere { get; set; } // this is good as it is public so accessible everywhere
public virtual void SomeWeirdFunction()
{
ThisIsOnlyAccessibleForTopClass = "I can access this here as it is grand father's private member!";
}
}
public class MiddleClass : TopClass
{
public override void SomeWeirdFunction()
{
base.ThisIsOnlyAccessibleForTopClassAndMiddleClass = "As this is a MiddleClass class, I am accessible here.. That is good!";
}
}
public class BottomClass : MiddleClass
{
public override void SomeWeirdFunction()
{
base.ThisIsOnlyAccessibleForTopClassAndMiddleClass = "I don't want this to be accessible here!";
}
}
我希望ThisIsOnlyAccessibleForTopClassAndMiddleClass
只能从MiddleClass
and访问TopClass
,而不是从BottomClass
.
我怎样才能做到这一点?而且由于我无法使用现有的访问修饰符(例如protected
, public
,internal
等)来做到这一点private
。这是否表明我试图在这里打破某种规则?
解决方案
如果您有一个特定 MiddleClass
的应该对 的成员具有特权访问权限TopClass
,则可以将其作为嵌套类型MiddleClass
放入。TopClass
嵌套类型可以访问其封闭类型的所有成员。
public class TopClass
{
private string ThisIsOnlyAccessibleForTopClass { get; set; }
private string ThisIsOnlyAccessibleForTopClassAndMiddleClass { get; set; } // I want this to be accessible only by the MiddleClass
public string AccessibleFromEverywhere { get; set; } // this is good as it is public so accessible everywhere
public virtual void SomeWeirdFunction()
{
ThisIsOnlyAccessibleForTopClass = "I can access this here as it is grand father's private member!";
}
public class MiddleClass : TopClass
{
public override void SomeWeirdFunction()
{
base.ThisIsOnlyAccessibleForTopClassAndMiddleClass = "As this is a MiddleClass class, I am accessible here.. That is good!";
}
}
}
public class BottomClass : TopClass.MiddleClass
{
public override void SomeWeirdFunction()
{
// compilation error:
// base.ThisIsOnlyAccessibleForTopClassAndMiddleClass = "I don't want this to be accessible here!";
}
}
如果您MiddleClass
在与 相同的程序集中有一个或多个类TopClass
,并且所有BottomClass
类都将在另一个程序集中,则可以使用private protected
. 它的意思是“只访问既是internal
又是”的类protected
,而protected internal
意思是“访问既是又是”的internal
类protected
。
// in Assembly A
public class TopClass
{
private string ThisIsOnlyAccessibleForTopClass { get; set; }
private protected string ThisIsOnlyAccessibleForTopClassAndMiddleClass { get; set; } // I want this to be accessible only by the MiddleClass
public string AccessibleFromEverywhere { get; set; } // this is good as it is public so accessible everywhere
public virtual void SomeWeirdFunction()
{
ThisIsOnlyAccessibleForTopClass = "I can access this here as it is grand father's private member!";
}
}
public class MiddleClass : TopClass
{
public override void SomeWeirdFunction()
{
base.ThisIsOnlyAccessibleForTopClassAndMiddleClass = "As this is a MiddleClass class, I am accessible here.. That is good!";
}
}
// in Assembly B, which references Assembly A
public class BottomClass : MiddleClass
{
public override void SomeWeirdFunction()
{
// compile error
// base.ThisIsOnlyAccessibleForTopClassAndMiddleClass = "I don't want this to be accessible here!";
}
}
推荐阅读
- regex - (正则表达式)没有 For 每个循环的 MatchCollection
- swift - 为什么基本的 Swift 代码会导致内存泄漏?
- xamarin - 如何更改所选选项卡的字体图标颜色?
- reactjs - 是否可以在反应中更新引导表中的单元格?
- python - Modin 比 pandas 花费更多时间来阅读 CSV
- node.js - 表中保存的外键为空 Sequelize Postgres Association(Node js)
- java - 而漂亮的格式化 XML更改此标头
- php - 如何使用字符串获取多维数组的值
- javascript - 从数据库php调用电话号码后,将电话号码添加到电话号码
- bash - ./gitlab-deploy/.gitlab-deploy.staging.sh:第 8 行:“0”:语法错误:预期操作数(错误标记为“0”)