C# 需要说明:虚拟、覆盖和基础
为什么O.W2()中的“第二个ID:”字符串没有打印出来?我知道D2属性是空的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
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;
}