cur*_*Boy 7 c# oop inheritance
我有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!";
}
}
Run Code Online (Sandbox Code Playgroud)
我希望ThisIsOnlyAccessibleForTopClassAndMiddleClass
只能从MiddleClass
和访问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!";
}
}
Run Code Online (Sandbox Code Playgroud)
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!";
}
}
Run Code Online (Sandbox Code Playgroud)