覆盖继承对象的属性

时间:2015-12-18 06:06:39

标签: .net vb.net oop

任何人都可以通过以下方式告诉我自定义来自一系列核心业务对象(现有框架)的业务对象的最佳方法:

假设我们的对象是Employee,它继承自Person。 Person有一组对象,电话号码(由底层框架指定) 我想重新定义这个对象,指定新的字段,所以我创建了对象NewPhoneNumber,它继承自PhoneNumber。

如何在不更改底层框架的情况下使Employee使用NewPhoneNumber?

A)复制代码库,在我的代码中进行我想要的更改以反映这一点(即,这不再使用底层代码库,而是几乎复制它)。 IE浏览器。创建Employee对象作为几乎与Person相同但具有更改的对象? B)在Employee对象上创建一个新的集合属性,公开NewPhoneNumber的集合,它产生一个奇怪的对象定义。

A似乎是唯一真正的解决方案,但奇怪的是,它似乎并非如此。

我特别不想改变代码库,我只想继承和扩展定义。底层对象仍然是具有PhoneNumbers的Person,它仅由Employee和NewPhoneNumber扩展。

我正在使用.Net(特别是VB)

由于

1 个答案:

答案 0 :(得分:0)

如果无法更改底层框架,则限制设计派生类并将其设置为现有属性。

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

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

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

想象一下,您没有CompanyPerson源代码。您仍然可以在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或派生类Personyou 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源代码是重新考虑你的场景的一个很好的理由。