C#中是否有一种方法可以防止派生类继承受保护的属性?
class Base
{
protected int A { get; set; }
}
class DerivedA : Base
{
}
class DerivedB : DerivedA
{
}
我想要的是DerivedA能够访问属性A,但是DerivedB不能。那么有没有办法在继承层次结构的中间限制属性的继承?
答案 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
{
}