我有一些孤立的代码严重影响了我的大脑:
Person caster = new Person(name: "Caster", age: 24);
Console.WriteLine(caster.ToString());
object o = caster;
Console.WriteLine(o.ToString());
输出:
Caster is 24
Caster is 24
Person
的实施正如您所料。唯一要注意的是我如上所述覆盖ToString
。
这个输出怎么可能?如果您从<{1}} 派生的类型上调用ToString
,则会调用更具体的实现object
。
但是当我们分配给Object.ToString
时,运行时如何知道调用object
而不是Person.ToString
?这与多态性有关吗?谢谢。
答案 0 :(得分:0)
通过方法覆盖将其称为运行时多态性。由于tostring()
类在下面的caster
类中被覆盖,因此actual type
而不是declared type
在运行时解析方法调用。
object o = caster;
Console.WriteLine(o.ToString());
此处声明的类型为Object
,但实际类型为Person
,因此tostring()
的{{1}}会被调用。
答案 1 :(得分:-1)
其Runtime多态,ToString方法返回表示对象实例的字符串。运行时始终从大多数子类遍历到基类。
Person caster = new Person(name: "Caster", age: 24);
object o = caster;
Console.WriteLine(o.GetType());
Console.WriteLine(o.ToString());
这里的实例是caster,作为上面代码中的证据o.GetType()将Person显示为其类型。