在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。不选角怎么能得到这个结果?强制转换要求我在编译时了解类型。

在c sharp中使用不带强制转换的父类的ToString

您不需要在每个级别上声明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关键字来消除编译器警告,并明确表示要对该方法进行阴影处理而不覆盖该方法。