2015-12-18 3 views
0

Может кто-нибудь пожалуйста, скажите мне, лучший способ настроить бизнес-объект, от костюма основных бизнес-объектов (существующая структура) следующим образом:переопределить свойство на унаследованном объекте

Скажем, наш объект Employee, который наследуется от Личности. У человека есть набор объектов, номер телефона (указанный базовой структурой) Я хочу переопределить этот объект, указав новые поля, поэтому я создаю объект NewPhoneNumber, который наследуется от PhoneNumber.

Как заставить Employee использовать NewPhoneNumber без изменения базовой структуры?

A) скопируйте базу кода, внесите изменения, которые я хочу в свой код, чтобы отразить это (т. Е. Это больше не использует базовую базу кода, но копирует ее почти). То есть. Создайте объект Employee как почти идентичный объект как Person, но с изменениями? B) Создайте новое свойство коллекции на объекте Employee, представляя коллекцию NewPhoneNumber, которая делает странное определение объекта.

A казалось бы единственным реальным решением, но, как ни странно, не кажется очень OO.

Я специально не хочу менять базу кода, я просто хотел бы наследовать и расширять определение. Основным объектом все равно будет Person with PhoneNumbers, который расширяется только Employee и NewPhoneNumber.

Я использую .NET (VB специально)

Благодаря

ответ

0

Если вы не можете изменить это , лежащие в основе рамки, вы вынуждены создавать свои производные классы и установить их в существующие свойства ,

Например (в C#, но все же полезно в VB.NET):

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

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

Представьте, что вы не владеете Company и Person исходный код. Вы все еще можете установить EnhancedPerson в -typed собственности 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 - хорошая причина подумать о рефакторинге для вашего решения. Для меня исходный код .NET без генериков в 2015 году является хорошей причиной для переосмысления вашего сценария.

Смежные вопросы