【问题标题】:Polymorphic or generic approach is better? C#多态还是泛型方法更好? C#
【发布时间】:2009-05-15 11:17:28
【问题描述】:

我有两个类和一个类似的接口

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. 与普通驱动程序相比,您认为通用实现有什么优势吗?如果是,它们是什么?
  2. 你更喜欢哪一个?通用的还是普通的?
  3. 有没有更好的方法来实现通用驱动程序?
  4. 我感觉 C# 中的泛型与 C++ 模板相比非常有限。这是真的吗?

有什么想法吗?

【问题讨论】:

    标签: c# c++ generics templates


    【解决方案1】:
    1. 在这种情况下绝对没有任何优势。除非你真的想在Drive() 中创建T 的实例,这可以在没有泛型的情况下使用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();
        }
    }
    

    这样我就可以使用强类型的Driver&lt;&gt;.Vehicle 属性,它属于特定类型,而不是更常见的IVehicle

    【讨论】:

    • 泛型主要是获得类型安全的工具。二进制代码将由泛型类型的所有用途共享,但编译器将确保类型正确。与 C++ 相比,C++ 的实现(二进制文件)将针对每种类型,甚至允许根据参数对模板进行不同的实现。
    【解决方案2】:
    1. 我真的看不出你的例子有什么好处,但他们做的事情不同。普通的可以使用已经创建的车辆,而普通的只能创建新的。
    2. 由于这些方法做不同的事情,这取决于。哪个更适合您的代码。我个人会使用普通的。
    3. 我不确定您为什么要使用泛型。在这种情况下,它对您没有多大帮助。
    4. 是的,C++ 模板要强大得多。看看所有奇怪的 Boost 库。这主要是因为 C++ 模板是在编译时完成的,而不是像 .NET 那样在运行时/JIT 时完成。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-26
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        • 2017-05-14
        相关资源
        最近更新 更多