2017-11-15 6 views
-1

現在抽象基本クラスの複数の派生クラスを設定できるアーキテクチャを設定しています。これらのクラスは、メソッドの実際のロジックを実装し、プロパティに値を割り当てます。派生抽象クラスを使用してモデルで使用される異なるロジックを定義する

プロパティに応じて、尊重するクラスの特定のロジックを実装するモデルがあります。

public abstract class AbstractLogic 
{ 
    protected String Prop1 { get; set; } 
    public abstract String Method1(); 
} 


public class ActualLogic : AbstractLogic 
    { 
     public ActualLogic() 
     { 
      Prop1 = "Test"; 
     } 

     public override string Method1() 
     { 
      throw new NotImplementedException(); 
     } 

    } 

public class Model 
{ 
    public string LogicType { get; set; } 
    private AbstractLogic Logic { get; set; } //I need to have something like this to use the logic inside of the model 
} 

私はどこかModel.logic.Method1()を呼び出す例えば、一般的な方法でクラスを使用すると、それは、このアーキテクチャで

私の問題は、私はModelをロードするときということですActualLogicクラスからロジックを引く必要がありますLogicプロパティは常にnullなので、それを扱うのは非常に難しく、一貫性がないと感じます。

私は本当に良い解決策の周りに私の頭を包むことができないので、多分誰かが私を助けることができます。たぶんインターフェイスが良いでしょうか?または汎用クラスですか?私は両方を試みましたが、より良い結果を得ることはできませんでした。

ありがとうございます。

編集

は答えに私自身の答えを移動しました。

+2

ここでジェネリック医薬品は必要ないようにアクセスすることができます。あなたが必要とするのは、使用する前に 'Logic'プロパティをインスタンス化することです。 –

+0

モデルにコンストラクタを追加して初期化します。 'public Model(){Logic = new ActualLogic();} } ' –

+0

ActualLogicのインスタンスが作成されていません。 Logic = new ActualLogic();モデル – MwBakker

答えて

0

適切なロジッククラスにアクセスするさらに良い方法が見つかりました: 私のモデルでは、プロパティ列挙型LogicTypeを定義し、拡張メソッドを使用してLogicClassにアクセスします。

public enum LogicType 
    { 
     actuallogic, 
     actuallogic2 
    } 

    public static class LogicExtensions 
    { 
     public static AbstractLogic LogicClass(this LogicType self) 
     { 
      switch (self) 
      { 
       case LogicType.actuallogic: 
        return new ActualLogic(); 
       case LogicType.actuallogic2: 
        return new ActualLogic2(); 
       default: 
        return null; 
      } 
     } 
    } 

抽象クラスは、すでにあなたのモデルがで動作する必要があるインターフェイスを定義して以来、今私は、このModel.LogicType.LogicClass()

関連する問題