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访问#_C#_Oop_Inheritance - Fatal编程技术网

C# 如何限制受保护成员只能从第一级子C访问#

C# 如何限制受保护成员只能从第一级子C访问#,c#,oop,inheritance,C#,Oop,Inheritance,我有三个级别的课程 TopClass 中产阶级 BottomClass 而中产阶级是从顶级派生出来的,底层是从中产阶级派生出来的 我想在TopClass中拥有一个属性,该属性只能从TopClass和MiddleClass访问,而不能从BottomClass访问 当我使用protectedaccess修饰符时,TopClass中的protected属性可以从BottomClass访问 以下是我的课程,以提供更好的洞察力 public class TopClass { private

我有三个级别的课程

  • TopClass
  • 中产阶级
  • BottomClass
中产阶级
是从
顶级
派生出来的,
底层
是从
中产阶级
派生出来的

我想在
TopClass
中拥有一个属性,该属性只能从
TopClass
MiddleClass
访问,而不能从
BottomClass
访问

当我使用
protected
access修饰符时,
TopClass
中的protected属性可以从
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!";
     }
 }
我希望只有从
中间类
顶级
,而不是从
底层
,才可以访问
这一点

我该怎么做?由于我无法使用现有的访问修饰符,如
受保护的
公共的
内部的
私有的
等。。这是我试图打破某种规则的迹象吗?

如果您有一个特定的
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!";
    }
}
如果您在与
TopClass
相同的程序集中有一个或多个
MiddleClass
类,并且所有
BottomClass
类都将位于另一个程序集中,则可以使用
私有保护的
。它表示“仅访问
内部
受保护的
”类,而
受保护的内部
表示“访问
内部
受保护的
类”


你试过
seal
关键字吗?这在C#中通常是不可能的。根据您试图实现的目标,可能还有其他选择,但您在这里向我们展示的抽象设计很难说。@TấnNguyên-如果您使用密封类,那么您将无法从该类继承。在这种情况下,我不能使用BottomClass进行继承。我在这里遗漏了什么吗?您是只希望
中间类
能够访问该成员,还是希望
顶级
的任何直接子类能够访问该成员?例如,如果我要创建
类AnotherMiddleClass:TopClass
,它是否能够访问该成员?@JoeSewell-对于我现在试图解决的问题,这对我来说真的不重要。所以,如果你知道的话,就像一个工作区,我很想听听。。谢谢
// 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!";
    }
}