Sud*_*ash 0 c# string virtual casting
我有一个带有很长继承链的基类。我在具有基类类型的变量中传递子类的实例。我可以在子类的实例上执行 ToString 并让子类的 ToString 运行(而不是父类)吗?
这是我的尝试:
namespace Abc
{
class A
{
string strA = "A";
public virtual string ToString() { return strA; }
}
class B : A
{
string strB = "B";
public virtual string ToString() { return base.ToString() + strB; }
}
class C : B
{
string strC = "C";
public virtual string ToString() { return base.ToString() + strC; }
}
class Program
{
static void Main(string[] args)
{
A a = new C();
System.Console.WriteLine(a.ToString());
System.Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
该程序输出A. 我认为添加virtual关键字会使它输出ABC。我怎样才能在不投射的情况下得到这个结果?转换要求我在编译时知道类型。
您不需要virtual在每个级别都声明,您只需要在声明它的类中进行声明,子类应该这样做override。因为ToString()在Object其中定义了A从您的所有类中隐式派生的内容应该只使用override
class A
{
string strA = "A";
public override string ToString() { return strA; }
//Added a example of somthing not declared in Object
public virtual string Example() { return "I am in A!"; }
}
class B : A
{
string strB = "B";
public override string ToString() { return base.ToString() + strB; }
//Notice the override instead of the virtual.
public override string Example() { return "I am in B!"; }
}
class C : B
{
string strC = "C";
public override string ToString() { return base.ToString() + strC; }
public override string Example() { return "I am in C!"; }
}
Run Code Online (Sandbox Code Playgroud)
导致错误的原因是你在哪里Shadowing ToString(),你应该得到一个编译器警告,告诉你你在哪里这样做,你需要使用new关键字来摆脱编译器警告并明确声明你想要隐藏而不是覆盖方法。