如何在不显式调用派生类的情况下创建基于派生类的ctor参数的对象

时间:2019-12-04 10:53:24

标签: c# design-patterns creation-pattern

我已将我的真实问题简化为以下示例:

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方法的名称可能有所不同)的同时,这样做的最佳方法是什么?

0 个答案:

没有答案
相关问题