c# - 如何扩展派生类中虚拟成员的访问修饰符?
问题描述
我在学习 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; }
,但这不是我想要的。我想要这里的多态性。
请赐教。谢谢你。
解决方案
您可以隐藏基类属性并在那里提供一个设置器。从本质上讲,类的签名将完全符合您的要求,尽管这是一种解决方法。
public class Bar : Foo
{
public new int SomeProperty
{
get => base.SomeProperty;
set => base.SomeProperty = value;
}
}
推荐阅读
- html - writeHTML 后更改页面格式
- angularjs - 在旧版 AngularJS 网站 (Java/Spring) 中集成 Webpack
- time - 如何将一个时域中的时钟转换为另一个时域?
- version-control - 控制版的优势还是非优势?
- java - PDFBox 文本矩阵缩放行为
- javascript - 通过 if 启用和禁用按钮
- python - 如何在不每次都对模型收费的情况下进行预测 - tensorflow?
- html - 导航栏切换器弄乱了导航栏品牌对齐
- database - 如何在 Go DRY 中扫描数据库行?
- abap - abap:从现有的一个创建动态内部表