4

型推論を使用するいくつかの機能を持つ基本クラスがあります...

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

    public abstract void SetProcessors();
}

次に、2つのクラスがあります。

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

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

そして、これら2つに、これら2つのクラスを構成する2つのプロセッサーもあります。

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();
    }
}
4

2 に答える 2

1

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>
于 2012-07-17T15:58:17.203 に答える
0

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();
    }
}
于 2012-07-17T16:04:55.283 に答える