我已将我的真实问题简化为以下示例:
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();
}
}
比方说,我有一个父类汽车,从中可以得出三个类:私有,卡车和公共汽车
派生类的构造函数接收类 Driver 的一个参数。
Driver类除其他属性外还包含属性 License 。
假定每个驾驶员只能获得三种汽车(私人,卡车,公共汽车)之一的许可证。
我想创建一个函数,该函数将根据提供给该函数的Driver返回一个派生类之一的对象。
我希望该函数的用户收到一个对象,他可以在该对象上为每个派生类(例如bus1.OpenBackDoor()
或truck1.AttachWagon()
)调用特定函数。
在保持示例代码的一般结构(Create方法的名称可能有所不同)的同时,这样做的最佳方法是什么?