[英]Polymorphism and c#
最近在MS采訪中提出了一個基本問題
class A {
public virtual void Method1(){}
public void Method2() {
Method1();
}
}
class B:A {
public override void Method1() { }
}
class main {
A obk = new B();
obk.Method2();
}
那么調用哪個函數? 抱歉打字錯誤。
B.Method1();
被調用,因為它正確地覆蓋了虛方法A.Method1();
在這種情況下, B.Method1
被調用。 這是因為即使變量輸入為A
,實例的實際類型也是B
CLR基於實例的實際類型而不是變量的類型以多態方式調度對Method1
的調用。
將調用類B
Method1
,您可以通過運行以下程序看到:
class Program
{
static void Main(string[] args)
{
var b = new B();
b.Method2();
Console.ReadLine();
}
}
class A
{
public virtual void Method1()
{
Console.WriteLine("Method1 in class A");
}
public void Method2()
{
Method1();
}
}
class B : A
{
public override void Method1()
{
Console.WriteLine("Method1 in class B");
}
}
規則是“覆蓋最派生類中的成員” ,在本例中為“B”。
B.Method1()由於覆蓋而被調用。
調用B.Method1是因為它在類定義中被重寫。
這個問題有點曖昧......但......
調用obk.method2()。 反過來,它調用obk.Method1,因為它是B的一個實例,它已被B.Method1覆蓋。 所以B.Method1最終被稱為。
正如其他人所說,B.Method2被召喚。 以下是一些其他信息,以便您了解正在發生的事情:
((A)B).Method2();
B.Method2();
這些都會調用B.Method1(),因為它被正確覆蓋了。 為了調用A的Method1,必須有一個base.Method1()調用B(通常但不總是在B.Method1的實現中完成)。
但是,如果以這種方式定義B:
class B:A {
new public void Method1() { }
...然后調用A的Method1()因為Method1實際上沒有被覆蓋,它被隱藏並隱藏在多態性規則之外。 一般來說,這通常是一件壞事。 並非總是如此,但要確保你非常了解自己在做什么,以及如果你做過類似的事情,為什么要這樣做。
另一方面,以這種方式使用new也會產生一些有趣的面試問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.