【发布时间】: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<SpecificValue>(1).Single() 但我仍然相信有一种方法可以返回特定值,而不必在 Main() 中键入特定值
【问题讨论】: