首页 > 解决方案 > 如何扩展派生类中虚拟成员的访问修饰符?

问题描述

我在学习 C# 之前学习了 Java,而且我通常发现 C# 比 Java 给我作为程序员更多的自由,这就是我真正喜欢它的原因。我对我目前遇到的有关访问修饰符的问题感到有点困惑。说我有课。

public class Foo
{
    public virtual int SomeProperty { get; protected set; }
}

还有另一个派生类。

public class Bar : Foo
{
    public override int SomeProperty { get; set; }
}

编译器抛出一个错误说

CS0507“Bar.SomeProperty.set”:覆盖“受保护”继承成员“Foo.SomeProperty.set”时无法更改访问修饰符

为什么会这样?在 Java 中,我可以通过在派生类中重写基成员来扩展对基成员的访问,而不是相反。(阅读:你不能在派生类中进一步限制基成员)我在这里遗漏了什么或者做了一些我不知道的愚蠢的事情吗?

我知道我可以声明public new SomeProperty { get; set; },但这不是我想要的。我想要这里的多态性。

请赐教。谢谢你。

标签: c#ooppolymorphism

解决方案


您可以隐藏基类属性并在那里提供一个设置器。从本质上讲,类的签名将完全符合您的要求,尽管这是一种解决方法。

public class Bar : Foo
{
    public new int SomeProperty
    {
        get => base.SomeProperty;
        set => base.SomeProperty = value;
    }
}

推荐阅读