2017-08-17 13 views
-2

をジェネリッククラス継承メソッドを作るために私は2つの基底クラスを持っている:どのように他の一般的なクラスから

DataLogic<T> 
{ 
    protected abstract IEnumerable<string> Validate(T o); 

    protected virtual bool Editable(T o) 
    { 
     return true; 
    } 

    protected virtual bool Viewable(T o) 
    { 
     return true; 
    } 
} 

ImportLogic<T> 
{ 
    public IEnumerable<string> Import(Stream importFileStream) 
    { 
     ... 
     IEnumerable<T> importedObjects; 
     ... 
     foreach (var importedObject in importedObjects) 
     { 
      ... 
      // HERE I WANT TO REACH METHOD FROM DATA LOGIC 
      var validationResult=Validate(importedObject); 
      ... 
     } 
     ... 
    } 

    protected abstract bool IsStructureValid(Worksheet sheetToValidate); 
} 

データロジックは、データ検証などのすべてのデータ操作を処理します。だから私はCarオブジェクトのビジネスロジックを処理するCarLogc : DataLogic<Car>のようなクラスを持つことができます。

インポートロジックは、ファイルを扱うような操作を処理します。だから私は車のリストをインポートする場合。

ここで、車オブジェクトの検証方法は1か所だけにしたいと思いますが、これはDataLogic(車の場合はCarLogic)にする必要があります。

しかし、CarImportLogicクラスを作成した場合、それはImportLogic<Car>から継承されます。CarLogicも継承できません。私が思いついた

一つの解決策は、ImportLogicがDATALOGICプロパティをcontainng与えることですが、それは、コードがはるかに不明確になり、私はデータのメソッドを公開する必要があるので、私は、それを好きではありません。

だから、どのように私は、これらの目標を達成することができます

  • は異なるビジネス・オブジェクトの一般的なクラスがあります。
  • 一つだけの場所での検証ロジックを持っています。
  • はImportLogicクラスから検証ロジックに到達することができます。
  • は、エレガントで開発が簡単に自分のコードを保管してください。
+1

私はあなたの代わりに相続の構図をしたいと思いますので、あなたのソリューションは、悪いことではありません。同様のアプローチは、デコレータのように、データとインポートロジックの両方をまとめた別のクラスを作成することです。 – CrudaLilium

+0

@CrudaLilium私は自分の質問でヒットについて書いていますが、構成は現在のコードの明快さと柔軟性を失っています。両方のロジックを一緒にラップするワーキングソリューションを提供できる場合は、 –

答えて

0

私は最初あなたの質問に誤解していましたので、いくつかのことを指摘しましょう。 あなたが提供したコードから、両方の論理クラスが抽象クラスでなければならないことがわかります。この場合、DataLogicクラスはpublicメソッドを持たないため抽象化としては役に立たない。 ImportLogicはDataLogic.Validateに依存しますが、最初に公開する必要があります。次に、両方の機能をラップする1つのクラスを作成すると思われます。この場合は、Logicクラスをインタフェースとして作成し、デフォルトの機能を持つ1つの抽象クラスを作成する方がよいでしょう。

interface IValidate<T> 
    { 
     IEnumerable<string> Validate(T objectToValidate); 
    } 

    interface IImport<T> 
    { 
     IEnumerable<string> Import(Stream importFileStream); 
    } 

    abstract class LogicWrapper<T> : IValidate<T>, IImport<T> 
    { 
     protected virtual bool Editable(T o) 
     { 
      return true; 
     } 

     protected virtual bool Viewable(T o) 
     { 
      return true; 
     } 
     public abstract IEnumerable<string> Validate(T objectToValidate); 

     public IEnumerable<string> Import(Stream importFileStream) 
     { 
      return this.Validate(default(T)); 
     } 
    } 

    class CarLogic : LogicWrapper<Car> 
    { 
     public override IEnumerable<string> Validate(Car objectToValidate) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

これはあなたが探しているものであれば言うことは難しい、または私はあなたが次のCarLogicクラスを使用する予定の方法がわからないので、右のクラス構造です。あなたのコードをエレガントで簡単に開発したい場合は、SOLIDの原則に従えばうまくいくでしょう。

関連する問題