2015-12-18 270 views
0

可有人告訴下列方式我定製的業務對象,它是從核心業務對象的西裝最好的方式(現有的框架):覆蓋屬性

說,我們的目標是員工,它從Person繼承。 人有一個對象集合,電話號碼(由底層框架指定) 我想重新定義這個對象,指定新的字段,所以我創建了對象NewPhoneNumber,它從PhoneNumber繼承。

如何讓員工在不更改底層框架的情況下使用NewPhoneNumber?

A)複製代碼庫,在我的代碼中進行我想要的更改以反映此問題(即不再使用底層代碼庫,但幾乎可以複製它)。 IE瀏覽器。將Employee對象創建爲與Person幾乎完全相同的對象,但包含更改? B)在Employee對象上創建一個新的集合屬性,公開NewPhoneNumber的集合,這會產生一個奇怪的對象定義。

A似乎是唯一真正的解決方案,但奇怪的是似乎不太OO。

我特別不想更改代碼庫,我只想繼承和擴展定義。底層對象仍然是具有PhoneNumbers的Person,它僅由Employee和NewPhoneNumber擴展。

我使用的.Net(VB專)

感謝

回答

0

如果你不能改變基本框架,你的約束來設計你的派生類,並將其設置爲現有的屬性。

例如(在C#中,但仍然在VB.NET中有用):

public class Person {} 
public class EnhancedPerson : Person {} 

public class Company 
{ 
    public Person Person { get; set; } 
} 

想象一下,你沒有自己CompanyPerson源代碼。您還可以設置一個EnhancedPersonPerson -typed財產上Company

Company company = new Company(); 
// An upcast from EnhancedPerson to Person. No problem 
// because an EnhancedPerson is a Person after all. 
company.Person = new EnhancedPerson(); 

爲了在編譯時間,以實現更多的輸入(即讓Company.Person財產分型爲Person或派生類的Personyou need to use generics和這將意味着改變你的基類。例如,Company將如下所示:

public class Company<TPerson> where TPerson : Person 
{ 
    public TPerson Person { get; set; } 
} 

...並使用它:

Company<EnhancedPerson> company = new Company<EnhancedPerson>(); 

但是你說你不想改變你的代碼庫。誰知道如果仿製藥是考慮對您的解決方案進行重構的好理由。對我而言,2015年沒有泛型的.NET源代碼是重新考慮您的方案的一個很好的理由。