防止继承的成员访问受保护的成员

时间:2018-10-15 06:50:40

标签: c# inheritance properties polymorphism

C#中是否有一种方法可以防止派生类继承受保护的属性?

class Base
{
   protected int A { get; set; }
}

class DerivedA : Base
{
}

class DerivedB : DerivedA
{
}

我想要的是DerivedA能够访问属性A,但是DerivedB不能。那么有没有办法在继承层次结构的中间限制属性的继承?

3 个答案:

答案 0 :(得分:3)

好吧,评论中有一些有价值的信息,所以我认为最好重述一下,以免丢失。

Kevin Gosse建议使用private protected访问修饰符。

  

private protected关键字组合是成员访问修饰符。私有受保护成员可以通过包含类的派生类型进行访问,但只能在其包含程序集中进行访问。

请注意,此访问修饰符仅在c#7.2或更高版本中可用。

虽然我同意凯文(Kevin)的观点,但这可能是对您问题的直接回答,HimBromBeere建议实际上,这个问题是XYProblem-表示您正在询问如何实施自己的解决方案遇到问题,而不是问如何解决根本问题。
我也同意他的看法。

Fildor建议使用composition over inheritance-这是一个很好的观点。仅将继承用于代码重用是一个错误。请记住,派生类是基类类型的特定类型-例如,狗可以从动物派生,因为狗是动物的特定类型,但是飞机不能仅由于它们都具有引擎而从汽车派生

要获得实际潜在问题的答案,我建议您编辑问题以包括该问题,不仅包括您要实施的当前解决方案,或者可以提出全新的问题。

答案 1 :(得分:1)

您应该将其密封:

class Base
{
   protected int A { get; set; }
}

class DerivedA : Base
{
   protected sealed override int A { get => base.A; set => base.A = value; }
}

class DerivedB : DerivedA
{
   // Attempting to override A causes compiler error.
}

在此处了解更多信息:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/sealed

答案 2 :(得分:0)

为什么要让一个类不继承其基类的受保护属性? 您应该重新设计班级模型:

    class Base
    {            
    }

    class BaseA : Base
    {
        protected int A { get; set; }
    }

    class Derived : Base
    {
    }

    class DerivedA : BaseA
    {
    }