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
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; } }
我还在这里展示了使用基本限制类,但这不是必需的。
运行时将IRestriction
和IRestriction
视为不同的不同类(它们甚至有自己的一组静态变量)。 在您的情况下,inheritance层次结构中IRestriction
IRestriction
和IRestriction
IRestriction
的唯一类是IRestriction
和object
。
事实上,拥有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
上访问Limit
为object
。 例如:
foreach(IRestriction restriction in this.Restrictions) { Console.WriteLine(restriction.Limit); }
接口是实现合同的实体需要遵循的合同。
您创建了两个具有相同名称IRestriction
据我所知,你基本上可能需要的是一个可以限制的类的标志,它应该实现IRestriction
非generics接口。
第二个接口似乎是也包含limit属性的可限制对象。 因此,第二个IRestriction
接口的定义可以是ILimitRestriction
或任何适合您业务需求的名称。
因此, ILimitRestriction
可以inheritance自IRestriction
,这将标记inheritanceILimitRestriction
仍然是IRestriction
对象的IRestriction
上述就是C#学习教程:inheritanceNon-Generic One C#的通用接口分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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;} }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1000780.html