2014-01-04 7 views
0

Что такое лучший способ сделать следующее:OO дизайн полиморфизма

Пусть у меня есть класс с именем Person и много производных классов для специализированных лиц.

Предположим, что в начале моего приложения я знаю, что мне приходится иметь дело с человеком, но я не буду знать, что это за человек, намного позже (что-то вне моего контроля, поэтому я не могу определить тип Person на начало).

Итак, вначале создаю Person и заполните его атрибутами. Позже, когда я знаю, что это за Person, я должен создать экземпляр специализированного лица и скопировать все сохраненные атрибуты для нее.

Есть ли более элегантный способ сделать это без создания двух объектов?

+0

, если вы могли бы добавить немного кода вашего класса. Это было бы очень полезно. – Jain

+0

Если это отличный вид человека, подклассы могут помочь. если это так, что люди могут иметь разные атрибуты, вы можете сохранить их на карте, возможно, карту перечисления. –

ответ

1

Если вы не знаете тип лица спереди, вы не сможете избежать создания экземпляра двух объектов. Должно быть что-то, что должно содержать базовые атрибуты Person, прежде чем вы узнаете специализированного человека, но вы не сможете воспользоваться полиморфизмом, не создавая экземпляр специализированного объекта позже.

Один из вариантов заключается в использовании шаблона композиции, в котором каждый специализированный человек содержит экземпляр Person, а не наследует его. Вам все равно нужно создать экземпляр двух объектов, но вам не нужно переписывать код для копирования по сохраненным атрибутам каждый раз. Вот пример (C# синтаксис):

public interface IPerson 
{ 
    string Name { get; } 
    int Age { get; } 
} 

public class Person : IPerson 
{ 
    public string Name { get; private set; } 
    public int Age { get; private set; } 

    public Person(string name, int age) 
    { 
     Name = name; 
     Age = age; 
    } 
} 

public abstract class SpecialPersonBase : IPerson 
{ 
    private IPerson myPerson; 

    protected SpecialPersonBase(IPerson person) 
    { 
     myPerson = person; 
    } 

    public string Name { get { return myPerson.Name; } } 

    public int Age { get { return myPerson.Age; } } 

    public abstract string Greet(); 
} 

public class Doctor : SpecialPersonBase 
{ 
    public Doctor(IPerson person) : base(person) { } 

    public override string Greet() 
    { 
     return "How are you feeling?"; 
    } 
} 

public class Accountant : SpecialPersonBase 
{ 
    public Accountant(IPerson person) : base(person) { } 

    public override string Greet() 
    { 
     return "How are your finances?"; 
    } 
} 

Вы можете использовать классы, как это:

IPerson bob = new Person("Bob", "25"); 

// Do things with the generic object 
// until you can determine the specific type 

SpecialPerson specialBob; 
if (bobIsDoctor) 
{ 
    specialBob = new Doctor(bob); 
} 
else if (bobisAccountant) 
{ 
    specialBob = new Accountant(bob); 
} 

specialBob.Greet(); 
+0

вот что я сделал в конце ... спасибо за подтверждение! – mfc

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