【问题标题】:How to force an implementation of an abstract method and returning interface如何强制实现抽象方法并返回接口
【发布时间】:2018-11-18 07:02:37
【问题描述】:
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&lt;SpecificValue&gt;(1).Single() 但我仍然相信有一种方法可以返回特定值,而不必在 Main() 中键入特定值

【问题讨论】:

    标签: c# generics interface


    【解决方案1】:

    您可以像这样将抽象类定义为通用类:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 2012-11-14
      相关资源
      最近更新 更多