C# 返回抽象返回类型的子类?

C# 返回抽象返回类型的子类?,c#,inheritance,C#,Inheritance,我的项目结构如下: // 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 :

我的项目结构如下:

// 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()


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

您可以使
作业

公共抽象类作业,其中TResult:JobResult
{
公共摘要TResult Run();
}
公共类职位1:职位
{
公共重写作业1结果运行()
{
//
}
}

你可以做
工作

公共抽象类作业,其中TResult:JobResult
{
公共摘要TResult Run();
}
公共类职位1:职位
{
公共重写作业1结果运行()
{
//
}
}

这是继承的全部概念。在这里,返回父类被认为是一项功能。但是,在
Job1

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

然后,Job1.Run()的调用方必须知道正确的返回类型,并将其强制转换为访问特定于该类的
Job1Result
方法这就是继承的整个概念。在这里,返回父类被认为是一项功能。但是,在
Job1

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

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

尝试将其更改为
public override Job1Result Run()
?@McAdam331抱歉,我的项目中有此返回类型,但我忘了将其包含在我的问题中。我已将其更新为包含它。但仍然存在错误。这称为返回类型协方差。它不受支持。重写必须与签名、泛型约束和返回类型匹配。另请参阅尝试将其更改为
公共重写作业1Result Run()
?@McAdam331抱歉,我的项目中有此项,但我忘了在这里的问题中包含它。我已将其更新为包含它。但仍然存在错误。这称为返回类型协方差。它不受支持。覆盖必须与签名、通用约束、,和返回类型。另请参见,但如果不需要访问Job1result中的任何特殊内容,则始终需要将返回值从
JobResult
转换为
Job1result
,如果不需要访问任何内容,则始终需要将返回值从
JobResult
转换为
Job1result
来自Job1Results的特殊虽然我喜欢这个解决方案,但我很确定我不能使用它,因为Entity Framework不允许将泛型类用作实体。如果我错了,请纠正我。@JensOlsen112:我以前从未使用过实体框架,但从技术上讲,
Job1
不是泛型类,注意,这种方法将为每个具体类型创建兄弟类,而这些具体类型通常不是继承所期望/想要的:
Job1:Job
Job2:Job
彼此不相关,因为它们没有共同的父级。虽然我喜欢这个解决方案,但我很确定我不能使用它,因为框架不允许将泛型类用作实体。如果我错了,请纠正我。@JensOlsen112:我以前从未使用过实体框架,但从技术上讲,
Job1
不是泛型类,请注意,这种方法将为每个具体类型创建兄弟类,而这些具体类型通常与继承不符:
Job1:Job
Job2:Job
彼此不相关,因为没有公共父类。