多态或通用方法更好?C#

Nav*_*K N 4 c# c++ generics templates

我有两个类和一个界面

interface IVehicle
{
    void Drive();
}

class Benz :IVehicle
{
    public void Drive()
    {
        Console.WriteLine("WOW! driving benz");
    }
}

class Ferrari : IVehicle
{
    public void Drive()
    {
        Console.WriteLine("WOW! driving ferrari");
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个使用它的Driver类.

class Driver
{
    public void StartDriving(IVehicle vehicle)
    {
        vehicle.Drive();
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个通用的驱动程序.

class GenericDriver
{
    public void StartDriving<T>() where T : IVehicle , new()
    {
        T vehicle = new T();
        vehicle.Drive();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

  1. 与普通驱动程序相比,您认为通用实现有什么优势吗?如果是的话,他们是什么?
  2. 你更倾向哪个?通用的还是普通的?
  3. 有没有更好的方法来实现通用驱动程序?
  4. 我觉得与C++模板相比,C#中的泛型非常有限.真的吗?

有什么想法吗?

Ant*_*lev 9

  1. 在这种情况下绝对没有任何优势.除非你真的想要创建一个Tin 的实例Drive(),这可以在没有泛型的情况下完成delegate IVehicle VehicleBuilder();
  2. 这取决于实际情况.但一般来说我更喜欢先.
  3. 再说一次:这取决于你想做什么.
  4. 是的,这是真的.但请记住,C++模板是编译时(JIT时间)构造,而C#泛型是运行时构造.

现在我为什么要通用Driver.考虑:

class Driver<TVehicle>
    where TVehicle : class, IVehicle, new()
{
    public TVehicle Vehicle { get; set }

    public Driver()
    {
        Vehicle = new TVehicle();
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我将能够使用强类型Driver<>.Vehicle属性,该属性将是特定类型,而不是更常见的属性IVehicle.