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

时间:2010-09-14 20:56:14

标签: c# class-design

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

// 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
   }
}

由于King的{​​{1}}覆盖方法期待Get课程并且不接受其子ResultResultA,因此无效。

/ p>

我能采取更好的方法吗?

4 个答案:

答案 0 :(得分:4)

通常的做法是使用泛型。

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();
    }
}

编辑:修复语法。

答案 1 :(得分:1)

如果您使用编译的代码,它会有所帮助。你的“具体实现”是假的,看起来你混合了类和方法的概念。这里没有设计问题。例如:

public class KingA : King {
    public override Result Get() {
        return new ResultA();
    }
}

答案 2 :(得分:1)

我认为这里存在一些语法混淆 - 如果我正确地捕捉到你的意图,这样可以正常工作:

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

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

// main abstract result
public abstract class Result
{
    private int _Type;
    public int Type { get { return _Type; } set { _Type = value; } }
}

// KingA result
public class ResultA : Result
{

}

// KingB result
public class ResultB : Result
{

}

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

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

class Program
{
    static void Main(string[] args)
    {
        IKing ka = new KingA();
        IKing kb = new KingB();

        Result ra = ka.Get();
        Result rb = kb.Get();

        if (ra is ResultA)
        {
            Console.WriteLine("A ok!");
        }

        if (rb is ResultB)
        {
            Console.WriteLine("B ok!");
        }
    }
}

(为格式编辑)

答案 3 :(得分:0)

您应该能够在ResultA的实现中明确地将ResultBResult转换为Get(我假设这是“具体实现”的意图是)。