12

考虑这个通用类:

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; }
}
4

4 回答 4

16

对于泛型版本,方法可以采用 type 的参数Request<FooOperation>。传递一个实例Request<BarOperation>是无效的。
因此,通用版本使方法能够确保它们获得正确操作的请求。

于 2013-02-12T15:00:08.963 回答
12

除了所有其他好的答案之外,我还要补充一点如果您碰巧Request<T>使用 a构造一个T实现IOperation. 每次都是非通用版本框。

于 2013-02-12T15:25:54.273 回答
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;
    }
}

如果您有 a Foo<int>,您可能不想将其与 a 进行比较Foo<string>,但无法使用非通用版本将其锁定。

于 2013-02-12T15:09:49.060 回答
3

例如,如果你有

public class SubOperation : IOperation 
{
    // implementation ...
}

public class OtherSubOperation : IOperation 
{
    // implementation ...
}

您可以确保 Request 永远不会包含 OtherSubOperation 项,但它们都是有效的 IOperations。

于 2013-02-12T15:02:32.117 回答