inheritanceNon-Generic One C#的通用接口

这是课堂设计问题。

我有主要的抽象类

public abstract class AbstractBlockRule { public long Id{get;set;} public abstract List Restrictions {get;}; } public interface IRestriction{} public interface IRestriction:IRestriction where T:struct { T Limit {get;} } public TimeRestriction:IRestriction { public TimeSpan Limit{get;set;} } public AgeRestriction:IRestriction { public int Limit{get;set;} } public class BlockRule:AbstractBlockRule { public virtual List Restrictions {get;set;} } BlockRule rule=new BlockRule(); TimeRestriction t=new TimeRestriction(); AgeRestriction a=new AgeRestriction(); rule.Restrictions.Add(t); rule.Restrictions.Add(a); 

我必须使用非generics接口IRestriction,以避免在主抽象类中指定generics类型T. 我对仿制药很新。 有人可以让我知道如何更好地设计这件事吗?

您的方法很典型(例如,IEnumerable 像这样实现IEnumerable)。 如果要为代码的使用者提供最大效用,那么在非generics接口上提供非generics访问器,然后将其隐藏在通用实现中会很不错。 例如:

 public abstract class AbstractBlockRule { public long Id{get;set;} public abstract List Restrictions { get; set; } } public interface IRestriction { object Limit { get; } } public interface IRestriction : IRestriction where T:struct { // hide IRestriction.Limit new T Limit {get;} } public abstract class RestrictionBase : IRestriction where T:struct { // explicit implementation object IRestriction.Limit { get { return Limit; } } // override when required public virtual T Limit { get; set; } } public class TimeRestriction : RestrictionBase { } public class AgeRestriction : RestrictionBase { } public class BlockRule : AbstractBlockRule { public override List Restrictions { get; set; } } 

我还在这里展示了使用基本限制类​​,但这不是必需的。

运行时将IRestrictionIRestriction视为不同的不同类(它们甚至有自己的一组静态变量)。 在您的情况下,inheritance层次结构中IRestriction IRestrictionIRestriction IRestriction的唯一类是IRestrictionobject

事实上,拥有IRestriction列表是唯一合理的方法。


作为旁注:无论您是处理IRestriction还是IRestriction ,您都可以访问属性Limit 。 在这种情况下我要做的是定义另一个属性object Limit { get; } 关于IRestriction ,并将其隐藏在实际实现中。 像这样:

 public interface IRestriction { object Limit { get; } } public interface IRestriction : IRestriction where T : struct { new T Limit { get; set; } } public class TimeRestriction : IRestriction { public TimeSpan Limit { get; set; } // Explicit interface member: // This is hidden from IntelliSense // unless you cast to IRestriction. object IRestriction.Limit { get { // Note: boxing happens here. return (object)Limit; } } } 

这样,当您不关心它的类型时,您可以在所有IRestriction Limit上访问Limitobject 。 例如:

 foreach(IRestriction restriction in this.Restrictions) { Console.WriteLine(restriction.Limit); } 

接口是实现合同的实体需要遵循的合同。

您创建了两个具有相同名称IRestriction

据我所知,你基本上可能需要的是一个可以限制的类的标志,它应该实现IRestriction非generics接口。

第二个接口似乎是也包含limit属性的可限制对象。 因此,第二个IRestriction接口的定义可以是ILimitRestriction或任何适合您业务需求的名称。

因此, ILimitRestriction可以inheritance自IRestriction ,这将标记inheritanceILimitRestriction仍然是IRestriction对象的IRestriction

 public abstract class AbstractBlockRule { public long Id{get;set;} public abstract List Restrictions {get;}; } public interface IRestriction{} public interface IRestrictionWithLimit:IRestriction where T:struct { T Limit {get;} } public TimeRestriction:IRestrictionWithLimit { public TimeSpan Limit{get;set;} } public AgeRestriction:IRestrictionWithLimit { public int Limit{get;set;} } public class BlockRule:AbstractBlockRule { public virtual List Restrictions {get;set;} }