如何使抽象方法返回具有具体实现的抽象类型? - c#

我有三个类,每个类将返回略有不同的结果。

// interfact to a king
public interface IKing{
  public Result Get();
}

// main abstract class
public abstract class King:IKing{
  public abstract Result Get();
}

// main abstract result
public abstract class Result{
  public int Type {get;set;}
}

// KingA result
public class ResultA:Result{
   ...
}

// KingB result
public class ResultB:Result{
   ...
}

// concrete implementations
public class KingA:King{
   public override ResultA Get(){
     return new ResultA;
   }
}

public class KingB:King{
   public override ResultB Get(){
     return new ResultB
   }
}

这将不起作用,因为KingGet重写方法需要Result类,并且将不接受其子级ResultAResultB

我可以采取更好的方法吗?

参考方案

通常的方法是使用泛型。

public interface IKing<T> where T:Result{
    T Get();
}

public class King<T> : IKing<T>
   public abstract T Get();
}

public class KingA : King<ResultB> {
    public override ResultA Get(){
        return new ResultA();
    }
}

public class KingB : King<ResultB> {
    public override ResultB Get(){
        return new ResultB();
    }
}

编辑:固定语法。

编程练习 - public class HelloWo

public class HelloWorld {    public static void main(String[] args) {        // 变量保存成绩        int score = 53;         // 变量保存加分次数        int count = 0;        //打印输出加分前成绩         S…

Java入门第一季 - public class HelloWo

public class HelloWorld {    public static void main(String[] args) {                // 变量保存成绩        int score = 53;                 // 变量保存加分次数        int count = 0;        //打印输…

将字段限制为类的实例并同时实现接口 - java

Java允许将子类实例分配给类类型的字段,例如:public class BaseClass { } public class SubClass extends BaseClass { } public class Example { private BaseClass field1; public void assign(SubClass subclass…

对Java接口实现的怀疑 - java

interface Device { public void doIt(); } public class Electronic implements Device { public void doIt() { } } abstract class Phone1 extends Electronic { } abstract class Phone2 ext…

从列表中获取价值(C#UWP) - c#

我有课 public class RootObject { public int id { get; set; } public int parent_id { get; set; } public string status { get; set; } public string order_key { get; set; } public string …