2013-04-11 59 views
1

我們知道無法將父對象轉換爲其子類之一。c#繼承:將父對象轉換爲子對象

那麼什麼是解決以下問題的好方法: 假設我有一個父類「Person」和兩個子類:Customer和Employee。請注意Person類是而不是抽象(意思是它可以實例化)。 現在我得到了以下方法簽名:

public Person GetPersonById(long id) 

這使得有可能要麼返回一個人,或者其子類中的一個。 如果我使用這種方法,我可以通過GetType()檢查它是否是一個孩子。但是,我無法輕鬆訪問特定於子類的字段/方法,因爲我不能僅僅投射它。 一種方法是爲每個將父類作爲參數的子類實現一個構造函數,並返回一個新的子類實例。這有缺點,我仍然會有很多重複的代碼(因爲我必須爲每個孩子分配每個父母字段)。

我能想到的另一種方法是將方法改成這樣:

public object GetPersonById(long id) 

這樣的話,我可以返回的任何類。我只是檢查返回的類的類型,然後正確地轉換它。但不知何故,這種方法似乎很髒。

沒有任何人有更好的方式來做到這一點?

回答

2

但事實上,你可以投父對象到其子類型,如果對象是該類型的

+1

好吧,我知道爲什麼我來到了錯誤的假設,你不能施放父母的孩子的:我使用實體框架並創建代理類,我總是相匹配的代理類的類型,因此它永遠不會工作。 – Cleo 2013-04-11 14:52:01

0

用途「是」關鍵字

if(instance is ChildClass) 
{ 
    //... 
} 
3

你可以施放PersonCustomer如果真的是Customer

var customer = person as Customer; 
if(customer != null) 
{ 
    // the person was really a Customer 
} 

如果你想你可以創建三個方法,而不是一個:

public Person GetPersonById(long id) 
public Customer GetCustomerById(long id) 
public Employee GetEmployeeById(long id) 

或者使用泛型(但我感到很抱歉在特定情況下,仿製藥):

public T GetPersonById<T>(long id) where T : Person 

,並稱之爲:

var person = GetPersonById<Employee>(123); 

但你仍然需要指定你在做什麼試圖在通話時間。

+0

好的答案,爲什麼你在這種情況下對泛型感覺不好? – 2014-06-03 07:31:20