我有一个抽象类,它是以下方法签名:
protected abstract TResponse Handle<TResponse>(T command)
在一个覆盖它的类中,我有类似下面的内容:
protected override TResponse Handle<TResponse>(ListFilmsByIdCommand command)
{
return 9;
}
然而,由于无法将int转换为TResponse,因此无法编译。如果我将TResponse
更改为int
或其他DTO
类型类,它也会失败。
有没有办法让抽象方法覆盖它,以便我可以返回我想要的任何类型?
答案 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;
}
}