考虑这个通用类:
public class Request<TOperation>
where TOperation : IOperation
{
private TOperation _operation { get; set; }
public string Method { get { return _operation.Method; } }
public Request(TOperation operation)
{
_operation = operation;
}
}
上面的通用版本在下面的非通用版本中提供了哪些真正的好处?
public class Request
{
private IOperation _operation { get; set; }
public string Method { get { return _operation.Method; } }
public Request(IOperation operation)
{
_operation = operation;
}
}
IOperation
界面是:
public interface IOperation
{
string Method { get; }
}
答案 0 :(得分:14)
使用通用版本,方法可以采用类型Request<FooOperation>
的参数。传入Request<BarOperation>
的实例将无效
因此,通用版本允许方法确保它们获得正确操作的请求。
答案 1 :(得分:12)
除了所有其他好的答案之外,如果您碰巧用Request<T>
构建T
,我将添加通用版本不会受到拳击惩罚这是一个实现IOperation
的值类型。每次都是非通用版本。
答案 2 :(得分:4)
如果你已经给出了上述内容,很难说你得到了什么好处,这将取决于你在代码库中如何使用它,但请考虑以下内容:
public class Foo<T>
where T : IComparable
{
private T _inner { get; set; }
public Foo(T original)
{
_inner = original;
}
public bool IsGreaterThan<T>(T comp)
{
return _inner.CompareTo(comp) > 0;
}
}
针对
public class Foo
{
private IComparable _inner { get; set; }
public Foo(IComparable original)
{
_inner = original;
}
public bool IsGreaterThan(IComparable comp)
{
return _inner.CompareTo(comp) > 0;
}
}
如果您有一个Foo<int>
,您可能不希望将它与Foo<string>
进行比较,但无法使用非通用版本将其锁定。
答案 3 :(得分:3)
例如,如果你有
public class SubOperation : IOperation
{
// implementation ...
}
和
public class OtherSubOperation : IOperation
{
// implementation ...
}
您可以确保Request永远不会持有OtherSubOperation项,但它们都是有效的IOperations。