返回抽象返回类型的子类



我的项目结构如下:

// Abstract class
public abstract class Job
{
    public abstract JobResult Run();
}
public abstract class JobResult { }
// Concrete implementer
public class Job1 : Job
{
    public override Job1Result Run() { }
}
public class Job1Result : JobResult { }

每个具体作业都继承自job并实现Run方法,该方法返回JobResult的具体类。

然而,当我这样做时,我会得到编译器错误:

"Job1.Run()":返回类型必须是JobResult才能匹配重写的成员Job.Run()

在重写抽象方法时,是否真的不可能返回返回类型的继承对象?

这就是继承的全部概念。返回父类被认为是这里的一个特性。但是,没有什么可以阻止您在Job1 中返回Job1Result

public JobResult Run()
{
  return new Job1Result();
}

然后Job1.Run()的调用方必须知道正确的返回类型,并将其强制转换为访问特定于该类的Job1Result方法

您可以使Job通用:

public abstract class Job<TResult> where TResult : JobResult
{
    public abstract TResult Run();
}
public class Job1 : Job<Job1Result>
{
    public override Job1Result Run()
    {
         //
    }
}

这里有一个例子,希望能对您有所帮助。

public interface IEvent
{
    Type GetEventType();
}

public abstract class AEvent<A>: IEvent where A: struct
{
    public Type GetEventType()
    {
        return typeof (A); // return sub struct type
    }
}

最新更新