簡體   English   中英

取實現接口的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM