执行以下操作的最佳方法是:
假设我有一个名为Person
的类和许多专门人员的派生类。
假设在我的应用程序开始时,我知道我必须与一个人打交道,但直到很久之后我才会知道它是什么样的人(我无法控制的东西,所以我无法在开始时确定Person类型)。
因此,在开始时,我将创建一个Person
并为其填充属性。后来,当我知道它是什么样的Person
时,我会实例化一个专门的人并为她复制任何保存的属性。
在没有创建两个对象的情况下,有更优雅的方法吗?
答案 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();