簡體   English   中英

多態性和c#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM