You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多级继承中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:15:31