使用 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
关键字摆脱编译器警告并明确声明您想要隐藏而不是覆盖该方法。
我有一个基础 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
关键字摆脱编译器警告并明确声明您想要隐藏而不是覆盖该方法。