c# - 防止继承成员访问 protected 成员

标签 c# inheritance properties polymorphism

在 C# 中有没有一种方法可以防止派生类继承 protected 属性?

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

class DerivedA : Base
{
}

class DerivedB : DerivedA
{
}

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

最佳答案

嗯,评论里有一些有值(value)的信息,所以我想我最好重述一下,以免丢失。

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

The private protected keyword combination is a member access modifier. A private protected member is accessible by types derived from the containing class, but only within its containing assembly.

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

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

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

要获得实际潜在问题的答案,我建议您编辑您的问题以包括该问题,而不仅仅是您正在尝试实现的当前解决方案,或者改为提出一个全新的问题。

关于c# - 防止继承成员访问 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52811154/

相关文章:

c# - C# 中的数组属性语法

c# - 从 ASP.Net 用户控制事件调用页面上的 javascript

java - 解释一下Java中的多态性?

java - 包中的基类和派生类

VB.net 自动属性 ​​- 只读?

java - 属性 key 文件中的转义 '<' '>'

c# - 如何从泛型类型中获取对属性访问器的委托(delegate)?

c# - Linq 填充类的值

c# - Linq to SQL Int16 在 SQL 命令中转换为 Int32

c# - int 是枚举的支持类型