首页 > 解决方案 > 如何限制受保护的成员只能从第一级子 C# 访问

问题描述

我有3个级别的课程。

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 只能从MiddleClassand访问TopClass,而不是从BottomClass.

我怎样才能做到这一点?而且由于我无法使用现有的访问修饰符(例如protected, public,internal等)来做到这一点private。这是否表明我试图在这里打破某种规则?

标签: c#oopinheritance

解决方案


如果您有一个特定 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意思是“访问既是又是”的internalprotected

// 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!";
    }
}

推荐阅读