我正在努力寻找一种场景,在该场景中使用非泛型接口(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)用作通用类型约束的情况?
更多示例(根据回复)
- 用作返回类型
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;
}
- 多个接口(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/