怎么可能像这样向后调用一个方法?

时间:2014-07-13 19:44:03

标签: c# oop inheritance

我有一些孤立的代码严重影响了我的大脑:

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?这与多态性有关吗?谢谢。

2 个答案:

答案 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显示为其类型。