使用 parent class 的 ToString 而不用 c sharp 转换

Using ToString of parent class without cast in c sharp

我有一个基础 class,具有很长的继承链。我在基类型为 class 的变量中传递 child class 的实例。我可以在 child class 的实例上执行 ToString 并让 child 的 ToString 运行(不是 parents)吗?

这是我的尝试:

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,你只需要在声明它的class中声明,child classes应该做 override 代替。因为 ToString() 是在 Object 中定义的,所以 A 是从所有你的 class 中隐式派生出来的,应该只使用 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!"; }
}

导致错误的原因是你在哪里 Shadowing ToString(),你应该得到一个编译器警告,告诉你你在哪里做的,你需要使用 new 关键字摆脱编译器警告并明确声明您想要隐藏而不是覆盖该方法。