OO多态性设计

时间:2014-01-04 04:59:45

标签: oop polymorphism

执行以下操作的最佳方法是:

假设我有一个名为Person的类和许多专门人员的派生类。

假设在我的应用程序开始时,我知道我必须与一个人打交道,但直到很久之后我才会知道它是什么样的人(我无法控制的东西,所以我无法在开始时确定Person类型)。

因此,在开始时,我将创建一个Person并为其填充属性。后来,当我知道它是什么样的Person时,我会实例化一个专门的人并为她复制任何保存的属性。

在没有创建两个对象的情况下,有更优雅的方法吗?

1 个答案:

答案 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();