2015-12-18 231 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源代码是重新考虑您的方案的一个很好的理由。