Полиморфный или общий подход лучше? C # - PullRequest
4 голосов
/ 15 мая 2009

У меня есть два класса и интерфейс, как

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 ++. Это правда?

Есть мысли?

Ответы [ 3 ]

9 голосов
/ 15 мая 2009
  1. Абсолютно никаких преимуществ в этом случае вообще. За исключением случаев, когда вы действительно хотите создать экземпляр T в Drive(), что можно сделать без шаблонов с delegate IVehicle VehicleBuilder();
  2. Это зависит от ситуации. Но, вообще говоря, я бы предпочел сначала.
  3. Опять же: это зависит от того, что вы хотите сделать.
  4. Да, это правда. Помните, однако, что шаблоны C ++ являются конструкциями времени компиляции (JIT time), тогда как шаблоны C # являются конструкциями времени выполнения.

Теперь о том, почему я хочу общий Driver. Рассмотрим:

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

    public Driver()
    {
        Vehicle = new TVehicle();
    }
}

Таким образом, я смогу использовать строго типизированное свойство Driver<>.Vehicle, которое будет иметь определенный тип, а не более распространенный IVehicle.

2 голосов
/ 15 мая 2009
  1. Я не вижу никаких преимуществ в вашем примере, но они делают разные вещи. Обычный имеет возможность использовать уже созданное транспортное средство, в то время как общий может создать только новое.
  2. Поскольку эти методы делают разные вещи, это зависит. Все, что работает лучше для вашего кода. Лично я бы использовал нормальный.
  3. Я не совсем уверен, почему вы хотите использовать дженерики. В этом случае вам мало что поможет.
  4. Да, шаблоны C ++ намного более мощные. Просто посмотрите на все странные библиотеки Boost. Это происходит главным образом потому, что шаблоны C ++ создаются во время компиляции, а не во время выполнения / JIT, как в .NET.
1 голос
/ 15 мая 2009

Второй означает, что вам нужно создавать новый объект каждый раз, когда он вызывается, тогда как первый позволит вам создавать вне вызова и, следовательно, повторно использовать объект, что может сэкономить много ресурсов при частом вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...