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

时间:2009-05-15 11:17:28

标签: 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");
    }
}

我有一个使用它的Driver类。

class Driver
{
    public void StartDriving(IVehicle vehicle)
    {
        vehicle.Drive();
    }
}

还有一个通用驱动程序。

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

问题

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

3 个答案:

答案 0 :(得分:9)

  1. 在这种情况下绝对没有任何优势。除非您确实要在T中创建Drive()的实例,否则可以在没有delegate IVehicle VehicleBuilder();的通用内容的情况下完成
  2. 这取决于具体情况。但一般来说我更喜欢先。
  3. 再说一次:这取决于你想做什么。
  4. 是的,这是事实。但请记住,C ++模板是编译时(JIT时间)构造,而C#泛型是运行时构造。
  5. 现在我为什么要通用Driver。考虑:

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

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

答案 1 :(得分:2)

  1. 我在你的例子中看不到任何优点,但他们做了不同的事情。普通车辆可以使用已经创建的车辆,而通用车辆只能创建新车辆。
  2. 由于这些方法做了不同的事情,这取决于。哪个更适合您的代码。我个人会使用正常的。
  3. 我不确定为什么你甚至想要使用泛型。在这种情况下,它对你没什么帮助。
  4. 是的,C ++模板 更强大。只要看看所有奇怪的Boost库。这主要是因为C ++模板是在编译时完成的,而不是像.NET那样的运行时/ JIT时间。

答案 2 :(得分:1)

第二种意味着每次调用时都需要构造一个新对象,而第一种方法允许你在调用之外构造并因此重用该对象,如果经常调用它可以节省很多资源。