使用父类的 ToString 而不用 C 锐化

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。我怎样才能在不投射的情况下得到这个结果?转换要求我在编译时知道类型。

Sco*_*ain 6

您不需要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关键字来摆脱编译器警告并明确声明你想要隐藏而不是覆盖方法。