簡體   English   中英

鍵入推斷和繼承

[英]Type inference and inheritance

我有一個基類,它有一些使用類型推斷的功能......

public abstract class Processor<T>
{
    ...
    public IProcessBuilder<T, TResult> Process<TResult>(Expression<Func<T, TResult>> propertyOfT)
    {
    }

    public abstract void SetProcessors();
}

然后我有兩個班:

public class EntityBase
{
    public string Name { get; set; }
}

public class EntityChild : EntityBase
{
    public string Description { get; set; }
}

在這兩個我也有兩個處理器配置這兩個類:

public class EntityBaseProcessor : Processor<EntityBase>
{
    public override void SetProcessors()
    {
        base.SetProcessors();
        this.Process(entity => entity.Name)
            .DoSomething();
    }
}

現在問題是我想為子類重用已配置的基本實體類進程以避免代碼重復:

public class EntityChildProcessor: EntityBaseProcessor
{
    public override void SetProcessors()
    {
        base.SetProcessor();
        this.Process(entity => /* entity.Description is of course missing */)
            .DoSomething();
    }
}

我顯然很累,因為我似乎找不到重用處理器類的可行方法,因為繼承的處理器類也應該使用繼承的實體類進行處理。

我當然可以重復代碼並將我的其他處理器編寫為:

public class EntityChildProcessor: Processor<EntityChild>
{
    public override void SetProcessors()
    {
        base.SetProcessor();
        // repeated code for inherited property
        this.Process(entity => entity.Name)
            .DoSomething();
        this.Process(entity => entity.Description)
            .DoSomething();
    }
}

使EntityBaseProcessor也是通用的:

public class EntityBaseProcessor<T> : Processor<T> where T : EntityBase

public class EntityChildProcessor<T> : EntityBaseProcessor<T> where T : EntityChild

或者:(您可以交換非通用EntityChildProcessor的簡單性,以獲得永久設置T類型的缺點)

public sealed class EntityChildProcessor : EntityBaseProcessor<EntityChild>

EntityBaseProcessor聲明為泛型類是多么合理? 像這樣的東西:

public class EntityBaseProcessor<TEntityBase> : Processor<TEntityBase>
    where TEntityBase : EntityBase
{
    public override void SetProcessors()
    {
        base.SetProcessors();
        this.Process(entity => entity.Name)
            .DoSomething();
    }
}

public class EntityChildProcessor : EntityBaseProcessor<EntityChild>
{
    public override void SetProcessors()
    {
        base.SetProcessors();
        this.Process(entity => entity.Description)
            .DoSomething();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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