C# 需要说明:虚拟、覆盖和基础

C# 需要说明:虚拟、覆盖和基础,c#,overriding,virtual,base,C#,Overriding,Virtual,Base,为什么O.W2()中的“第二个ID:”字符串没有打印出来?我知道D2属性是空的 using System; public class O { public string F { get; set; } public string L { get; set; } public string D { get; set; } public virtual string W() { return this.W2(); } pu

为什么O.W2()中的“第二个ID:”字符串没有打印出来?我知道D2属性是空的

using System;

public class O
{
    public string F { get; set; }
    public string L { get; set; }
    public string D { get; set; }

    public virtual string W()
    {
        return this.W2();
    }

    public virtual string W2()
    {
        return string.Format("First Name : {0}, Last name: {1}, ID: {2}", F, L, D);
    }
}

public class S : O
{
    public string D2 { get; set; }

    public override string W()
    {
        return base.W2();
    }

    public override string W2()
    {
        return base.W2() + string.Format(", Second ID: {0}", this.D2);
    }
}

class Program
{
    static void Main(string[] args)
    {
        O o = new S();

        o.D = "12345678";
        o.F = "John";
        o.L = "Jones";

        Console.WriteLine(o.W());

        // Output: First Name : John, Last name: Jones, ID: 12345678
    }
}

因为您调用了
override W()
,它反过来调用
base.W2()
。在类内部,
base.W2()
被静态地(在编译时)确定为基类中的一个:

public override string W()
{
    // directly calls W2() from the base class, ignores the override
    return base.W2(); 
}
如果您想在这个场景中使用多态性,应该省略
base
,只需调用
W2()

永远不会调用S对象中的函数W2()

Bec当你在S对象中调用W()时,你让它调用基W2()

试着这样做:

public override string W()
{
    String x = base.W2();
    x = x + this.W2();
    return x;
}

这只是学校里的一项任务,我不明白。+(正)让我困惑,为什么它被忽略了?因此,只输出
base.W2()
,而不输出
+string.Format(“,第二个ID:{0}”),this.D2)
?不会忽略
+
。问题是永远不会调用方法
重写字符串W2()
。只调用基本方法
虚拟字符串W2()
,它是从
重写字符串W()
调用的,它是从
void Main()
调用的。如果您将
覆盖字符串W()
更改为只
返回W2()
(而不是
返回base.W2()
),我想它会打印您所期望的内容。@Theodoros:您可能应该编辑您的答案,以包含能够提供预期行为的代码?这会让答案更清楚。哦,天哪。。。当然,永远不会调用方法
重写字符串W2()
。不知道我怎么没看到。谢谢现在一切都清楚了。@BinaryWorrier当然!我就这么做了。
public override string W()
{
    String x = base.W2();
    x = x + this.W2();
    return x;
}