這將被稱爲「擴大轉換」,因爲你成爲相對於引用類型不太具體,你拓寬組潛在類型。當你有一個Employee
參考時,你知道你可以使用該類的任何功能,當你有一個Person
對同一個對象的引用時,你只知道你可以使用Person
類中包含的功能。如果你想使用Employee
特定功能與你的prs
參考你首先要投你參考回到一個Employee
參考,如果prs
實際上不是Employee
類型的(也許是Customer
類型也從Person
繼承的),那麼你將獲得InvalidCastException
。
當您處理Person
參考時,SurName
屬性不會消失。你不能訪問它,因爲它不包含在Person
類中。基本上,如果您有基類類型的引用,則只能訪問基類中包含的屬性/方法。不要緊,它實際上是Employee
,你有一個Person
引用,所以對象被相應地處理。
轉換在您的示例中無用。當您嘗試以通用方式處理多個子類時,該轉換很有用。作爲一個例子,我可能有一個Person
類。除此之外,我還有Employee
,Customer
和Consultant
繼承自它的類。現在讓我們假設我有一個Store
對象,我想要做一些事情,比如獲取當前在商店中的每個Person
的名字。解決這個問題最簡單的方法是在商店裏有一個List<Person>
的人。因爲Employee
,Customer
和Consultant
全部來自Person
繼承我能做
peopleInMyStore.Add(MyEmployee);
peopleInMyStore.Add(MyCustomer);
peopleInMyStore.Add(MyConsultant);
於是後來我可以這樣做;
foreach (Person p in peopleInMyStore)
{
Console.WriteLine(p.Name);
}
這一概念被稱爲「多態」,可以讀到這裏http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
我的例子很做作,但是這是你使用繼承的主要原因之一。爲了給你一個真實的例子,我有一些測試代碼,我有一個名爲ApiTestSuite
的類,然後我有大約十幾個類都從它的形式SpecificApiTestSuite
繼承。該項目構建到命令行可執行文件中,您可以使用api參數(api = specificApiName)調用它,然後我可以執行類似的操作;
ApiTestSuite tests;
if (args[0] == "api1")
tests = new Api1TestSuite();
else
tests = new Api2TestSuite();
tests.RunTests();
SurName仍然存在,因爲您可以看到是否將prs轉回員工。 – redtuna