我已将我的真正问题简化为以下示例:
namespace Cars
{
public class Program
{
public static void Main(string[] args)
{
Car car1 = Car.Create(new Driver(1, "A", License.Private));
Car car2 = Car.Create(new Driver(2, "B", License.Truck));
Car car3 = Car.Create(new Driver(3, "C", License.Bus));
car1.OpenTrunk();
car2.AttachWagon();
car3.OpenBackDoor();
}
}
enum License { Private, Truck, Bus }
public class Driver
{
public uint ID { get; private set; }
public string Name { get; private set; }
public License License { get; private set; }
public Driver(uint id, string name, License license)
{
ID = id;
Name = name;
License = license;
}
}
public abstract class Car
{
protected Driver driver;
public Car(Driver driver)
{
this.driver = driver;
}
public static Car Create(Driver driver)
{
switch (driver.License)
{
License.Private: return new Private(driver);
License.Truck: return new Truck(driver);
License.Bus: return new Bus(driver);
}
}
}
public class Private : Car
{
public Private(Driver driver) : base(driver) {}
public void OpenTrunk();
}
public class Truck : Car
{
public Truck(Driver driver) : base(driver) {}
public void AttachWagon();
}
public class Bus : Car
{
public Bus(Driver driver) : base(driver) {}
public void OpenBackDoor();
}
}
假设我有一个父类Car派生出三个类:Private、Truck和Bus。
派生类的构造函数接收一个类Driver的参数。
类 Driver 包含属性License等属性。
假设每个司机只能拥有三种类型汽车(私人、卡车、公共汽车)之一的驾照。
我想创建一个函数,它将根据提供给函数的驱动程序返回一个派生类的对象。
我希望此函数的用户接收一个对象,他可以在该对象上为每个派生类调用特定函数,例如bus1.OpenBackDoor()
or truck1.AttachWagon()
。
在保持示例代码的一般结构的同时,最好的方法是什么( Create 方法的调用方式可能不同)?