在c sharp中使用不带强制转换的父类的ToString
本文关键字:转换 父类 ToString sharp | 更新日期: 2023-09-27 18:00:31
我有一个具有长继承链的基类。我在一个具有基类类型的变量中传递子类的实例。我可以在子类的实例上执行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();
}
}
}
该程序输出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!"; }
}
导致错误的原因是,在对ToString()
进行阴影处理时,应该会收到一个编译器警告,告诉您在哪里进行阴影处理,并且需要使用new
关键字来消除编译器警告,并明确表示要对该方法进行阴影处理而不覆盖该方法。