2012-05-24 86 views
1

我有5年的經驗。但說實話,而我知道和使用此結構...爲什麼要將派生類的實例分配給Type不是實例的變量,但其基類

Baseclass bc = new DerivedClass(); 

我不知道它實際上做,不是真的,不是真的。它是派生類還是基類?我知道如果我調用bc.Method(),我會得到派生類的方法。但只有當我使用新的關鍵字或覆蓋或什麼的。說實話,我在這裏開始有些模糊,我認爲我需要回到基礎知識,任何人都可以指引我走向正確的方向嗎?

+14

5年的經驗是什麼? –

+2

http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming – Dave

+0

你問實例化擴展類到基類的含義吧?你爲什麼不發表一個你的意思是簡單的類結構? –

回答

2

您正在創建一個DerivedClass實例並將其分配給一個BaseClass類型的變量。如果你有一個像基類Animal的類有兩個派生類Fish和Dog,但是你不知道哪一個將被實例化,這在你的上下文中並不重要,因爲你要調用一個被定義的方法在基類中。例如,你可能有這樣的事情:

Animal a; 
if (whatever you want) 
    a = new Dog(); 
else 
    a = new Fish(); 
a.Feed(); 

要小心使用改性劑,因爲如果你在動物與虛擬定義飼料,並覆蓋重新定義它的魚,魚的版本將被執行(這是鏈接在執行時)。如果您不將基本版本標記爲虛擬並將Fish版本標記爲新版本,則會執行Animal版本(它在編譯時鏈接)。

+0

弗朗切斯科,這是一個很好的迴應,我現在可以清楚地看到它! Thankyou ......而且這個便士已經隨着虛擬而下降,並且也被覆蓋了。 – Exitos

0

它只是創造的DerivedClass一個實例,並將其分配給BC它的類型是BaseClass的

+3

Nitpicking:實際上它將創建的實例分配給bc,該類型爲BaseClass類型。 –

+0

'bc'實際上是類型「處理'BaseClass'」 –

2

它創造的DerivedClassimplicitly casts它的一個實例鍵入Baseclass的。

正如我假定這編譯就意味着,從任一Baseclass繼承DerivedClass,例如:

class DerivedClass : Baseclass 
{ 
} 

或者有一個implicit cast operator對於這些類型的,例如鑄造之間

class DerivedClass 
{ 
    public static implicit operator Baseclass(DerivedClass d) 
    { 
     // return a Baseclass here 
    } 
} 
1

使用以下

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Employee : Person 
{ 
    public string RoleName { get; set; } 
} 

如果我們創建的Employee一個新的實例,但我們的變量聲明實際上是在Person,一切會發生是一個隱式轉換爲Person,這意味着我們將無法訪問Employee中的任何方法或屬性。我想這可能是有用的,如果Employee的構造函數影響Person的構造函數,但我們不關心Employee中的任何內容,但我不會推薦它。相反,我會建議構建一個利用更清晰的多態性的方法。例如,當派生對象用作參數時,實際上參數類型就是其基礎之一。

public void DoSomething(Employee employee) 
{ 
    // here we do something with an employee 
    // ... 

    string fullName = GetTheirFullName(employee); 
} 

public string GetTheirFullName(Person person) 
{ 
    return (person.FirstName + " " + person.LastName).Trim(); 
} 
相關問題