【问题标题】:How is it possible to call a method backwards like this? [duplicate]怎么可能像这样向后调用方法? [复制]
【发布时间】:2014-07-13 19:44:03
【问题描述】:

我有一些孤立的代码严重扭曲了我的大脑:

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,如上图所示。

这个输出怎么可能?如果您对从object派生的类型调用ToString,那么将调用更具体实现的Object.ToString

但是当我们分配给object 时,运行时如何知道调用Person.ToString 而不是Object.ToString?这与多态性有关吗?谢谢。

【问题讨论】:

  • 是的,在运行时你已经为对象分配了一个人,并且由于对象有一个 ToString() 方法,所以调用了超级是 ToString() 的方法。
  • caster.ToString() 应该给出对象的字符串描述。您需要使用Person 类的公共属性。例如:caster.Namecaster.Age.ToString()

标签: c# oop inheritance


【解决方案1】:

这被称为通过方法覆盖的运行时多态性。由于tostring() 在您的caster 类中被覆盖,当您执行以下操作时,方法调用在运行时由actual type 解决,而不是由declared type 解决。

object o = caster;
Console.WriteLine(o.ToString());

这里声明的类型是Object,但实际类型是Person,所以Person中的tostring()被调用。

【讨论】:

  • @Downvoter:介意发表评论吗?
  • 这是一个很好的问题,但很明显,它在互联网上有很多答案。 OP 没有付出足够的努力来查找信息,并且回答这个问题会激发低质量的问题。它应该被关闭,而不是回答。
  • @DmitryDovgopoly,同意并且应该被评论(同样你也这样做了),但不能对正确答案投反对票。
  • @Rahul 我相信这个想法是惩罚那些回答不费力的问题的人,以阻止使问题长期存在的行为。如果您可以发布一个不费吹灰之力、无需研究的问题并且仍然得到答案,那么它会鼓励您提出更多不费力、不需研究的问题。
  • @Rahul 我没有否决您的回答。我只是解释了反对者使用的理由。
【解决方案2】:

它的运行时多态性,ToString 方法返回一个字符串,表示对象实例。运行时总是从大多数子类遍历到基类。

 Person caster = new Person(name: "Caster", age: 24);       
        object o = caster;
        Console.WriteLine(o.GetType());           
        Console.WriteLine(o.ToString());

这里真正的实例是 caster ,作为上面代码中的证据 o.GetType() 将 Person 显示为其类型。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2019-04-08
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多