[英]Take class which implements interface
我有一個包含一些共享屬性的抽象基模型類。 最重要的是,我有許多次要接口,它們定義了模型可用於哪些進程。
下面是基類、接口和派生類的示例:
public abstract class ModelBase
{
public ModelBase(string name)
{
Name = name;
}
public int Id { get; private set; }
public int Name { get; private set; }
}
public interface ISupportProcessA
{
public decimal Amount { get; }
}
public class ModelDerived : ModelBase
{
public ModelDerived(string name) : base(name) { }
public decimal Amount { get; private set; }
}
為了使用基本模型執行一些工作,我還有一個抽象的基本處理器類,具有一些共享功能和一些派生處理器類,每個進程一個。 它可能看起來像這樣:
public abstract class ProcessorBase
{
private readonly ModelBase model;
public ProcessorBase(ModelBase model)
{
this.model = model;
}
// ...some shared methods
}
public class ProcessorA : ProcessorBase
{
private readonly ISupportProcessA model;
public ProcessorA(ISupportProcessA model) : base(model)
{
this.model = model;
}
// ...some specific methods
}
現在問題就在這里。 因為ISupportProcessA
(編譯器的知識)與ModelBase
無關,因此不能作為base()
輸入。 那講得通。
因此,我試圖做的是創建一個接口IModelBase
我用,而不是ModelBase
。 但是,一旦我連接到 Entity Framework,這會帶來一些問題,它不適用於接口(或者可能只是我?)。
所以這是我的問題:
無論如何要請求一個既從ModelBase
派生又實現ISupportProcessA
?
您可以通過泛型獲得一些方法:
public class ProcessorA<TModel> : ProcessorBase where TModel : ModelBase, ISupportProcessA
{
private readonly ISupportProcessA model;
public ProcessorA(TModel model) : base(model)
{
this.model = model;
}
// ...some specific methods
}
然而,這有點難看,因為您需要創建一個新的ProcessorA<ModelDerived>
,而不僅僅是一個ProcessorA
。
您可以添加更多樣板以使事情變得更好:
public abstract class ProcessorBase
{
protected abstract ModelBase ModelForBase { get; }
// ...some shared methods
}
public abstract class ProcessorA : ProcessorBase
{
public static ProcessorA Create<TModel>(TModel model) where TModel : ModelBase, ISupportProcessA
{
return new ProcessorA<TModel>(model);
}
// Abstract specific methods
public abstract void SomeSpecificMethod();
}
public class ProcessorA<TModel> : ProcessorA where TModel : ModelBase, ISupportProcessA
{
protected override ModelBase ModelForBase => model;
private readonly TModel model;
public ProcessorA(TModel model)
{
this.model = model;
}
// Specific method overrides
public override void SomeSpecificMethod()
{
}
}
這意味着您可以執行ProcessorA processor = ProcessorA.Create(new Model())
,但代價是更多樣板。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.