我有以下代码
public class Base {
public Base() {}
public virtual void IdentifyYourself() {
Debug.Log("I am a base");
}
public void Identify() { this.IdentifyYourself(); }
}
public class Derived : Base {
public Derived() {}
public override void IdentifyYourself() {
Debug.Log("I am a derived");
}
}
我在不同的入口点运行以下测试代码:
Base investigateThis = new Derived();
investigateThis.Identify()
输出为:"我是派生的"
所以无论C#'这个'使用关键字;无论在什么范围内,它总是指运行时类型'这个'用于?
奖励积分指向任何能够使用谷歌的人。比我好,并专门找到MSDN文档'这个' (双关语)行为。
最后,有没有人碰巧知道引擎盖下发生了什么?它只是演员?
更新#1 :修复了代码中的拼写错误;使用当前的答案集,我想我并没有完全理解MSDN文档对于#34; ..的含义是当前的实例。"。
更新#2 :道歉,我不确定我是否应该提出单独的问题,但经过进一步调查,我再次感到困惑;给定这个更新的代码,为什么输出都是:"我是派生的" &安培; "它是一个基地!"。
其他人没有回答过这个'这个'确实是运行时类型?如果我的更新问题仍然不明确,请告诉我。
更新的代码:
public class Base {
public Base() {}
public virtual void IdentifyYourself() {
Debug.Log("I am a base");
}
//Updated the code here...
public void Identify() { this.IdentifyYourself(); AnotherTake(); }
public void AnotherTake() { WhatIsItExactly(this); }
public void WhatIsItExactly(Derived thing) {
Debug.Log("It is a derived!");
}
public void WhatIsItExactly(Base thing) {
Debug.Log("It is a base!");
}
}
public class Derived : Base {
public Derived() {}
public override void IdentifyYourself() {
Debug.Log("I am a derived");
}
}
答案 0 :(得分:1)
绝对! investigateThis
指的是Derived
。
因此将调用IdentifyYourself
中的虚拟方法Derived
。这是运行时多态性有效。
范围无关紧要。
在底层,构建了一个虚函数表,并且对象中有一个指向该表的指针。
答案 1 :(得分:0)
'这'总是指当前的实例,而' base'总是指继承的类型,无论代码是否使用' this'在基类或子类中,它将始终引用子项(当然,除非基本实例化)。它只是对当前实例的引用,例如' self'在python中。如果参数与私有字段具有相同的名称,则有用,但据我所知,除此之外它没有任何功能目的,我将其用于可读性,以清楚地显示何时某些属于类I&#39我正在工作。
答案 2 :(得分:0)
如果您google: c# this以下链接是返回的第一个结果。
https://msdn.microsoft.com/en-us/library/dk1507sz.aspx
this 关键字引用该类的当前实例,并且是 也用作扩展方法的第一个参数的修饰符。
您可能还想看看 base 。
https://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx
base 关键字用于访问基类的成员 在派生类中:
在基类上调用已被另一个方法覆盖的方法 方法
指定创建时应调用哪个基类构造函数 派生类的实例。