重写通用抽象方法以返回特定类型

时间:2018-01-06 13:37:04

标签: c# generics

我有一个抽象类,它是以下方法签名:

protected abstract TResponse Handle<TResponse>(T command)

在一个覆盖它的类中,我有类似下面的内容:

protected override TResponse Handle<TResponse>(ListFilmsByIdCommand command)
{
    return 9;
}

然而,由于无法将int转换为TResponse,因此无法编译。如果我将TResponse更改为int或其他DTO类型类,它也会失败。

有没有办法让抽象方法覆盖它,以便我可以返回我想要的任何类型?

2 个答案:

答案 0 :(得分:0)

您无法覆盖TResponse Handle<TResponse>,并且实现返回除TResponse之外的任何内容,因为这是方法签名承诺其调用者的类型。

您可以向TResponse添加类型约束,以便构建和初始化它,但这会将内置类型(例如int)排除在TResponse之外:

interface IInitializable {
    void Initialize(object obj);
}
...
protected abstract TResponse Handle<TResponse>(T command) where TResponse : new, IInitializable;
...
protected override TResponse Handle<TResponse>(ListFilmsByIdCommand command) where TResponse : new, IInitializable {
    var res = new TResponse();
    res.Initialize(9);
    return res;
}

答案 1 :(得分:0)

当你有一个泛型方法时,这意味着该方法可以使用任何类型的对象,这显然这里的情况。您的方法只能返回int。因此,请在方法签名中删除您的泛型。

相反,请将您的抽象类设为通用:

class YourAbstractClass<T> {
    protected abstract T Handle(ListFilmsByIdCommand command);
}

然后,具体的子类可以这样做:

class ConcreteSubclass : YourAbstractClass<int> {
    protected abstract int Handle(ListFilmsByIdCommand command) {
        return 9;
    }
}