任何人都可以通过以下方式告诉我自定义来自一系列核心业务对象(现有框架)的业务对象的最佳方法:
假设我们的对象是Employee,它继承自Person。 Person有一组对象,电话号码(由底层框架指定) 我想重新定义这个对象,指定新的字段,所以我创建了对象NewPhoneNumber,它继承自PhoneNumber。
如何在不更改底层框架的情况下使Employee使用NewPhoneNumber?
A)复制代码库,在我的代码中进行我想要的更改以反映这一点(即,这不再使用底层代码库,而是几乎复制它)。 IE浏览器。创建Employee对象作为几乎与Person相同但具有更改的对象? B)在Employee对象上创建一个新的集合属性,公开NewPhoneNumber的集合,它产生一个奇怪的对象定义。
A似乎是唯一真正的解决方案,但奇怪的是,它似乎并非如此。
我特别不想改变代码库,我只想继承和扩展定义。底层对象仍然是具有PhoneNumbers的Person,它仅由Employee和NewPhoneNumber扩展。
我正在使用.Net(特别是VB)
由于
答案 0 :(得分:0)
如果无法更改底层框架,则限制设计派生类并将其设置为现有属性。
例如(在C#中,但在VB.NET中仍然有用):
public class Person {}
public class EnhancedPerson : Person {}
public class Company
{
public Person Person { get; set; }
}
想象一下,您没有Company
和Person
源代码。您仍然可以在EnhancedPerson
上为Person
类型的属性设置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
或派生类Person
)you need to use generics,这将意味着改变基类。例如,Company
看起来如下:
public class Company<TPerson> where TPerson : Person
{
public TPerson Person { get; set; }
}
......并使用它:
Company<EnhancedPerson> company = new Company<EnhancedPerson>();
但是你说你不想改变你的代码库。谁知道 generics 是否是考虑重构您的解决方案的一个很好的理由。对我来说,2015年没有泛型的.NET源代码是重新考虑你的场景的一个很好的理由。