多级继承中new方法调用异常:输出A而非C的原因及调用C的Foo方法
问题原因与解决方案
为什么输出是"A"而不是"C"
你写的代码里,类B和C中的Foo方法没有显式声明访问修饰符,在C#中,类成员默认的访问级别是private。这就导致:
- C类的
Foo是private,外部(比如Main方法)根本访问不到 - B类的
Foo也是private,同样无法被外部访问 - 当你在Main里调用
c.Foo()时,编译器会沿着继承链向上寻找可访问的同名方法,最终找到A类里的public版Foo,所以输出"A"
另外要注意:new关键字在这里只是隐藏了基类的方法,但因为子类的方法是private,外部调用时根本看不到这个隐藏的版本,自然就走了基类的public方法。
如何调用C类中声明的Foo方法
有几种可行的方式:
1. 将C类的Foo改为public访问级别
直接修改C类的方法声明,加上public关键字,这样外部就能直接访问:
class C : B { public new void Foo() { Console.Write("C"); } }
此时c.Foo()就会输出"C"。
2. 在C类中添加一个公共方法,内部调用自己的Foo
如果不想把Foo改成public,可以加一个公共的包装方法:
class C : B { new void Foo() { Console.Write("C"); } public void CallMyFoo() { Foo(); } }
然后在Main里调用c.CallMyFoo()就能输出"C"。
3. 使用反射调用私有方法
如果必须保持Foo为private,也可以通过反射来调用:
public static void Main(string[] args) { C c = new C(); typeof(C).GetMethod("Foo", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)?.Invoke(c, null); }
这种方式适合特殊场景,一般不推荐,因为破坏了封装性。
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

