c#oops为什么它不在示例代码中打印d

时间:2012-02-22 08:14:42

标签: c# oop

下面的代码将输出显示为“abc”。

请有人解释为什么不打印“d”

public class a
{
    public void m1(a obj)
    {
        Console.WriteLine("a");
    }
}

public class b :a
{
    public void m1(b obj)
    {
        Console.WriteLine("b");
    }
}

public class c: b
{
    public void m1(c obj)
    {
        Console.WriteLine("c");
    }
}

public class d: c
{
    public void m1(d obj)
    {
        Console.WriteLine("d");
    }
}

class MainRunning
{
    static void Main(string[] args)
    {
        a a1 = new a();
        b b1 = new b();
        c c1 = new c();
        d d1 = new d();

        d1.m1(a1);
        d1.m1(b1);
        d1.m1(c1);

        Console.ReadLine();
    }
}

4 个答案:

答案 0 :(得分:6)

打印d的方法正在等待d类型的实例作为其参数。您的调用没有将d传递给名为m1的方法,因此会使用其他重载。

您可以致电d1.m1(d1),该m1(d obj)将在d方法调用中解析,该调用会将{{1}}写入您的控制台。

答案 1 :(得分:5)

您有4个方法具有相同的名称但不同的参数列表。你打电话给他们三个,但不是第四个。

答案 2 :(得分:2)

这是因为你没有打电话

d1.m1(d1);

当您致电d1.m1(b1);时,只有可以使用该参数(b1)运行的方法是b类中包含的方法。
对于你运行的三种方法中的大部分,一次只有一个类可以处理它,而这个类不是d class ,它接受不同的参数类型!!

答案 3 :(得分:1)

请参阅以下内容:

class MainRunning
{
    static void Main(string[] args)
    {
        a a1 = new a();
        b b1 = new b();
        c c1 = new c();
        d d1 = new d();

        d1.m1(a1);
        d1.m1(b1);
        d1.m1(c1);
        d1.m1(d1); // <== ?

        Console.ReadLine();
    }
}