c# - 何时使用非泛型接口(interface)作为泛型类型约束

标签 c# generics interface

我正在努力寻找一种场景,在该场景中使用非泛型接口(interface)作为泛型类型约束是有意义的。下面是一个任意示例,其中非泛型方法 (RideCar2) 比泛型方法 RideCar 更简单。

class Program
{
    static void Main(string[] args)
    {
        var car = new Merc();
        RideCar(car);
        RideCar2(car);
    }

    static void RideCar<T>(T t) where T : ICar
    {
        t.StartEngine();
        t.StopEngine();
    }

    static void RideCar2(ICar car)
    {
        car.StartEngine();
        car.StopEngine();
    }
}

public interface ICar
{
    void StartEngine();
    void StopEngine();
}

public class Merc : ICar
{
    public void StartEngine() { Console.WriteLine("Merc start"); }
    public void StopEngine() { Console.WriteLine("Merc stop"); }
}

很明显,RideCar2 是一个更好的实现,因为它的噪音更小。

是否存在将非通用接口(interface)用作通用类型约束的情况?

更多示例(根据回复)

  1. 用作返回类型

static T RideCar(T t) where T : ICar
{
    t.StartEngine();
    t.StopEngine();
    return t;
}

使用普通方法仍然会使泛型方法无用,见下文:


static ICar RideCar(ICar car)
{
 car.StartEngine();
 car.StopEngine();
 return car;
}
  1. 多个接口(interface)

static void RideCar(T t) where T : ICar, ICanTimeTravel
{
    t.StartEngine();      // ICar
    t.TravelToYear(1955); // ICanTimeTravel
    t.StopEngine();       // ICar
}

使用带有多个参数的普通方法仍然会使泛型方法的使用变得无用,见下文:


static void RideCar(ICar car, ICanTimeTravel canTimeTravel)
{
 car.StartEngine();
 canTimeTravel.TravelToYear(1955);
 car.StopEngine();
}

最佳答案

是的,有。考虑:

static T RideCar<T>(T t) where T : ICar
{
    t.StartEngine();
    t.StopEngine();
    return t;
}

这将返回特定类型。现在您可以使用实现细节,而不必将其转换回实现类型,这是一种不好的做法。

此外,您可以对同一个通用参数设置多个接口(interface)约束:

static void RideCar<T>(T t) where T : ICar, ICanTimeTravel
{
    t.StartEngine();      // ICar
    t.TravelToYear(1955); // ICanTimeTravel
    t.StopEngine();       // ICar
}

最后,即使这有时被认为是代码味道,您也可以使用new() 约束和您的接口(interface)约束,以创建您的实现实例在方法中输入:

static T Create<T>() where T : ICar, new()
{
    T t = new T();
    return t;
}

关于c# - 何时使用非泛型接口(interface)作为泛型类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35218674/

相关文章:

scala - foreach 中的泛型类型有何意义?

java - 检查类型是否为接口(interface)

java - 为什么 IntelliJ 说尽管编译了类构造函数还是不正确?

c# - 程序有时会崩溃

c# - 如何将事件附加到公共(public)类中的方法?

c# - Powershell for 循环(来自 c#)

c# - EF Core 2.0 一对一 - 这是什么情况?

c# - 在 C# 中返回 'this' 的数组

c# - 通用接口(interface)继承非通用一个C#

interface - Golang 接口(interface)转换为嵌入式结构