【问题标题】:override property on inherited object覆盖继承对象的属性
【发布时间】:2015-12-18 06:06:38
【问题描述】:

谁能告诉我定制业务对象的最佳方式,该业务对象来自一套核心业务对象(现有框架),方法如下:

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

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

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

A 似乎是唯一真正的解决方案,但奇怪的是看起来不是很 OO。

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

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

谢谢

【问题讨论】:

    标签: .net vb.net oop


    【解决方案1】:

    如果您无法更改该基础框架,则您只能设计派生类并将它们设置为现有属性。

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

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

    假设您不拥有CompanyPerson 源代码。您仍然可以在Company 上将EnhancedPerson 设置为Person-typed 属性:

    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 属性输入为PersonPerson 的派生类)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 源代码是重新考虑您的方案的好理由。

    【讨论】: