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

如何强制实现抽象方法和返回接口

  •  0
  • CuriousDeveloper  · 技术社区  · 7 年前
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public interface IValue
    {
        int Id { get;}
    }
    
    public class SpecificValue : IValue
    {
        public int Id { get { return 3; } }
        public string Val { get; set; } 
    }
    
    public abstract class MustImplement
    {
        public abstract IEnumerable<IValue> GetValues(int number);
    }
    
    public class SpecificClass : MustImplement
    {
        public override IEnumerable<IValue> GetValues(int number)
        {
            var rv = new List<SpecificValue>();
            rv.Add(new SpecificValue()
            {Val = number + "Test"});
            return rv;
        }
    }
    
    public class Program
    {
        public static void Main()
        {
            var test = new SpecificClass();
            var values = test.GetValues(1).Single();
            Console.WriteLine(values.Id);
            //Console.WriteLine(values.Val); // This doesnt work
    
            var values2 = test.GetValues(1).Single() as SpecificValue;
            Console.WriteLine(values2.Id);
            Console.WriteLine(values2.Val); // This works but I dont want to have to cast. values2 is also potentially null now and that's annoying
        }
    }
    

    https://dotnetfiddle.net/7tA12E

    SpecificClass 我想去 SpecificValue 自动地,而不必投射它。

    GetValues() 退货不是特定的,取决于每个实施(只要他们遵守合同)

    test.GetValues<SpecificValue>(1).Single() 但我仍然相信有一种方法可以返回SpecificValue,而不必在Main()中键入SpecificValue

    1 回复  |  直到 7 年前
        1
  •  2
  •   Klaus Gütter    7 年前

    您可以将抽象类定义为泛型类,如下所示:

    public abstract class MustImplement<T> where T: IValue
    {
        public abstract IEnumerable<T> GetValues(int number);
    }
    
    public class SpecificClass : MustImplement<SpecificValue>
    {
        public override IEnumerable<SpecificValue> GetValues(int number)
        {
            var rv = new List<SpecificValue>();
            rv.Add(new SpecificValue()
            {Val = number + "Test"});
            return rv;
        }
    }