Это вопрос дизайна класса.Общий интерфейс, наследующий Non-Generic One C#
У меня есть абстрактный класс Основные
public abstract class AbstractBlockRule
{
public long Id{get;set;}
public abstract List<IRestriction> Restrictions {get;};
}
public interface IRestriction{}
public interface IRestriction<T>:IRestriction where T:struct
{
T Limit {get;}
}
public TimeRestriction:IRestriction<TimeSpan>
{
public TimeSpan Limit{get;set;}
}
public AgeRestriction:IRestriction<int>
{
public int Limit{get;set;}
}
public class BlockRule:AbstractBlockRule
{
public virtual List<IRestriction> Restrictions {get;set;}
}
BlockRule rule=new BlockRule();
TimeRestriction t=new TimeRestriction();
AgeRestriction a=new AgeRestriction();
rule.Restrictions.Add(t);
rule.Restrictions.Add(a);
Я должен использовать не универсальный интерфейс IRestriction просто не указывать общий тип T в главном абстрактном классе. Я очень новичок в дженериках. Может кто-нибудь дать мне знать, как лучше спроектировать эту вещь?
Трудно улучшить код для меня.Неограниченный базовый интерфейс мог бы иметь свойство 'ValueType BoxedLimit {get;}', если бы вы хотели, но я не уверен, что это полезно. В конце концов, зачем вам «Список <>» объектов разных типов? –
(Разумеется, очевидная идея сделать общий ковариантный интерфейс, 'IRestriction', не полезна, когда вы используете его со значениями типов (structs), поскольку C# и .NET не поддерживают ковариацию со значениями типов.) –
I Не знаю, почему вы не делаете ни абстрактный класс, ни метод, общий. Является ли 'Limit' минимальным или максимальным? Если так, возможно, «IComparable» был бы более полезен. –