C#能否不修改A、B基类,在派生类C中为上层基类B隐藏A的Foo方法
问题结论
不修改A、B类代码的前提下,你写的语法无法实现需求,但可以通过其他方案达成最终输出"Bar"的效果。
首先你尝试写的public new string B.Foo() { return "Bar"; }本身是C#不支持的非法语法,编译会直接报错。C#的成员隐藏规则不允许在子类中反向修改更上层父类的方法绑定逻辑:B类的Bar()方法在编译时就已经把Foo()的调用绑定到了A类的Foo()实现,只要不修改B的代码,通过B类型调用Bar()的逻辑永远不会变。
可落地的实现方案
方案1:组合替代继承(无兼容问题)
如果不需要C强制作为B的子类参与多态,优先用组合实现:
public class C { private readonly B _innerB = new B(); // 自定义Foo实现 public string Foo() => "Bar"; // 重写Bar逻辑 public string Bar() => Foo(); // 如果需要用到A/B的其他公开方法,手动添加转发即可,例如: // public string OtherMethodFromB() => _innerB.OtherMethodFromB(); }
调用代码和你原写法完全一致:
C c = new C(); Console.WriteLine(c.Bar()); // 输出结果为 Bar
方案2:保留B的继承关系,隐藏Bar方法
如果必须让C继承B,可以同时隐藏Foo和Bar方法:
public class C : B { public new string Foo() => "Bar"; public new string Bar() => Foo(); }
注意:该方案仅当变量类型为
C时调用Bar()会输出Bar,如果将C实例转为B类型调用Bar(),依然会输出Foo。
内容的提问来源于stack exchange,提问作者matthias_buehlmann
相关产品推荐
相关产品推荐

