首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止继承成员访问受保护成员

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

Stack Overflow用户
提问于 2018-10-15 06:50:40
回答 3查看 266关注 0票数 3

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

代码语言:javascript
运行
复制
class Base
{
   protected int A { get; set; }
}

class DerivedA : Base
{
}

class DerivedB : DerivedA
{
}

我希望DerivedA能够访问属性A,但是DerivedB不应该访问。那么,是否有一种方法来限制继承等级中间的属性的继承?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-15 07:50:21

嗯,在评论中有一些有价值的信息,所以我想我最好重述一下,这样它就不会丢失。

凯文·戈斯建议使用private protected访问修饰符。

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

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

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

我也同意他的观点。

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

为了得到真正的潜在问题的答案,我建议你编辑你的问题,包括这个问题,而不仅仅是你正在尝试实现的当前解决方案,或者可能会问一个全新的问题。

票数 3
EN

Stack Overflow用户

发布于 2018-10-15 07:03:01

你应该把它封起来:

代码语言:javascript
运行
复制
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://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/sealed

票数 1
EN

Stack Overflow用户

发布于 2018-10-15 07:03:25

为什么要类不继承其基类的受保护属性?你应该重新设计你的课堂模型:

代码语言:javascript
运行
复制
    class Base
    {            
    }

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

    class Derived : Base
    {
    }

    class DerivedA : BaseA
    {
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52811154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档