我有5年的經驗。但說實話,而我知道和使用此結構...爲什麼要將派生類的實例分配給Type不是實例的變量,但其基類
Baseclass bc = new DerivedClass();
我不知道它實際上做,不是真的,不是真的。它是派生類還是基類?我知道如果我調用bc.Method(),我會得到派生類的方法。但只有當我使用新的關鍵字或覆蓋或什麼的。說實話,我在這裏開始有些模糊,我認爲我需要回到基礎知識,任何人都可以指引我走向正確的方向嗎?
我有5年的經驗。但說實話,而我知道和使用此結構...爲什麼要將派生類的實例分配給Type不是實例的變量,但其基類
Baseclass bc = new DerivedClass();
我不知道它實際上做,不是真的,不是真的。它是派生類還是基類?我知道如果我調用bc.Method(),我會得到派生類的方法。但只有當我使用新的關鍵字或覆蓋或什麼的。說實話,我在這裏開始有些模糊,我認爲我需要回到基礎知識,任何人都可以指引我走向正確的方向嗎?
您正在創建一個DerivedClass實例並將其分配給一個BaseClass類型的變量。如果你有一個像基類Animal的類有兩個派生類Fish和Dog,但是你不知道哪一個將被實例化,這在你的上下文中並不重要,因爲你要調用一個被定義的方法在基類中。例如,你可能有這樣的事情:
Animal a;
if (whatever you want)
a = new Dog();
else
a = new Fish();
a.Feed();
要小心使用改性劑,因爲如果你在動物與虛擬定義飼料,並覆蓋重新定義它的魚,魚的版本將被執行(這是鏈接在執行時)。如果您不將基本版本標記爲虛擬並將Fish版本標記爲新版本,則會執行Animal版本(它在編譯時鏈接)。
弗朗切斯科,這是一個很好的迴應,我現在可以清楚地看到它! Thankyou ......而且這個便士已經隨着虛擬而下降,並且也被覆蓋了。 – Exitos
它只是創造的DerivedClass
一個實例,並將其分配給BC它的類型是BaseClass的
Nitpicking:實際上它將創建的實例分配給bc,該類型爲BaseClass類型。 –
'bc'實際上是類型「處理'BaseClass'」 –
它創造的DerivedClass
和implicitly casts它的一個實例鍵入Baseclass
的。
正如我假定這編譯就意味着,從任一Baseclass
繼承DerivedClass
,例如:
class DerivedClass : Baseclass
{
}
或者有一個implicit cast operator對於這些類型的,例如鑄造之間
class DerivedClass
{
public static implicit operator Baseclass(DerivedClass d)
{
// return a Baseclass here
}
}
使用以下
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();
}
5年的經驗是什麼? –
http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming – Dave
你問實例化擴展類到基類的含義吧?你爲什麼不發表一個你的意思是簡單的類結構? –