代码之家  ›  专栏  ›  技术社区  ›  Kenoyer130

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

  •  2
  • Kenoyer130  · 技术社区  · 14 年前

    // 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 Get 正在期待 Result 不会接受孩子 ResultA ResultB .

    有没有更好的办法?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Mark H    14 年前

    通常的方法是使用泛型。

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

    编辑:固定语法。

        2
  •  1
  •   Hans Passant    14 年前

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

    public class KingA : King {
        public override Result Get() {
            return new ResultA();
        }
    }
    
        3
  •  1
  •   twon33    14 年前

    我认为这里有一些语法混乱——如果我正确地理解了您的意图,那么这就可以了:

    // 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!");
            }
        }
    }
    

        4
  •  0
  •   TreDubZedd    14 年前

    您应该能够显式地强制转换 ResultA ResultB 作为 Result Get