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

3
在C#中,有没有一种方法可以防止派生类继承受保护的属性?
class Base
{
   protected int A { get; set; }
}

class DerivedA : Base
{
}

class DerivedB : DerivedA
{
}

我希望DerivedA能够访问属性A,但DerivedB不能。那么,在继承层次结构的中间有没有一种限制属性继承的方法呢?

3
这是不可能的。你为什么要尝试做那个?也许private protected可以帮助你? - Kevin Gosse
2
不行,做不到。一旦某个东西在基类中,它就会传递给所有继承者——即使该东西被声明为私有(顺便说一下,私有成员在任何其他类中都无法访问,但仍然会被继承)。 - Zohar Peled
3
@Lorago,那么 private protected 就是你需要的。它使得在同一程序集内访问成员时受保护,但在程序集外部则为私有。简而言之,你会将成员看作是受保护的,但当你的学生引用你的程序集时,他们会将其视为私有。 - Kevin Gosse
3
似乎您遇到了XY问题,也就是您认为将一个成员设置为protected是解决实际问题的方案。或许您可以提供更有意义的代码,因为现在的代码很难理解您具体在做什么。 - MakePeaceGreatAgain
2
投票关闭原因不明确。尽管对于 OP 发布的问题有一个明确的解决方案(参见 Kevin Gosse 的评论),但这可能不是潜在问题的答案。 - MakePeaceGreatAgain
显示剩余13条评论
3个回答

3

好的,这里的评论中有一些有价值的信息,所以我想我最好将它概括一下,以免失去。

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

private protected关键字组合是成员访问修饰符。私有受保护的成员可由从包含类派生的类型访问,但仅限于其包含的程序集。

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

虽然我同意Kevin这可能是你问题的直接答案,但HimBromBeere建议说,事实上这个问题是一个XYProblem - 这意味着你正在询问如何实现你有问题的解决方案,而不是询问如何解决根本问题。
我也同意他的看法。

Fildor建议使用组合优于继承 - 这是一个非常好的观点。仅为了代码重用而使用继承是一个错误。请记住,派生类是基类类型的特定类型 - 例如,狗可以从动物中派生出来,因为狗是动物的一种特定类型,但飞机不能从汽车中派生出来,只因为它们都有引擎。

为了获得实际根本问题的答案,我建议你编辑你的问题,包括该问题,而不仅仅是你试图实现的当前解决方案,或者也可以提出一个全新的问题。


1

1
我认为你误解了。OP希望DerivedB根本无法访问A。不仅仅是不能覆盖它。 - Fildor
2
如果您在DerivedA中重写它,则在Base中必须将其声明为虚函数...此外,这仍然没有回答原始问题 - A仍然可以被DerivedB访问。 - Zohar Peled

0

为什么您希望一个类不继承其基类的protected属性?您应该重新设计您的类模型:

    class Base
    {            
    }

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

    class Derived : Base
    {
    }

    class DerivedA : BaseA
    {
    }

我认为你有点意思。也许不是完全按照你的例子,但基本上是“组合优于继承”。 - Fildor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接