2013-08-23 30 views
0

我知道,在擴展轉換中,目標數據類型可以包含源數據類型提供的任何值。我可以在轉換值類型時明白這一點, 但不能在引用類型之間。我的問題是從如下場景:參考類型之間的擴展轉換

public class Person 
{ 
    public string Name { get; set; } 
} 

public class Employee : Person 
{ 
    public string SurName { get; set; } 
} 
static void Main(string[] args) 
{ 
    Employee emp = new Employee { Name = "Elvin", SurName = "Mammadov" }; 
    Person prs = emp; 
} 

如圖所示,類是祖先類Empoyee的。在前面的代碼中,我創建了參考Emplyee類,然後將僱員對象轉換爲Person。在這一點上,我輸了SurName數據字段和值。

我想知道:

  1. 是否countary到可以持有任何價值體現在哪裏?

  2. 爲什麼要將引用類型轉換爲直接或間接的祖先類或接口是一個擴展轉換?

感謝答覆

+0

SurName仍然存在,因爲您可以看到是否將prs轉回員工。 – redtuna

回答

3

這將被稱爲「擴大轉換」,因爲你成爲相對於引用類型不太具體,你拓寬組潛在類型。當你有一個Employee參考時,你知道你可以使用該類的任何功能,當你有一個Person對同一個對象的引用時,你只知道你可以使用Person類中包含的功能。如果你想使用Employee特定功能與你的prs參考你首先要投你參考回到一個Employee參考,如果prs實際上不是Employee類型的(也許是Customer類型也從Person繼承的),那麼你將獲得InvalidCastException

當您處理Person參考時,SurName屬性不會消失。你不能訪問它,因爲它不包含在Person類中。基本上,如果您有基類類型的引用,則只能訪問基類中包含的屬性/方法。不要緊,它實際上是Employee,你有一個Person引用,所以對象被相應地處理。

轉換在您的示例中無用。當您嘗試以通用方式處理多個子類時,該轉換很有用。作爲一個例子,我可能有一個Person類。除此之外,我還有Employee,CustomerConsultant繼承自它的類。現在讓我們假設我有一個Store對象,我想要做一些事情,比如獲取當前在商店中的每個Person的名字。解決這個問題最簡單的方法是在商店裏有一個List<Person>的人。因爲EmployeeCustomerConsultant全部來自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(); 
+0

但我無法訪問它。轉換後如何有用?請向我解釋一下。 –

+0

@ElvinArzumanoğlu我編輯了一些進一步的解釋。 – evanmcdonnal

+0

非常感謝,@evanmcdonnal。 –