2011-10-24 4 views
-2

あまりにも多くの詳細を与えるために5回投票したので、私はこれを書き直さなければなりませんでした。ジェネリックと継承... <T>タイプを指定する必要はありませんか?

私は現在、BaseModelクラスを継承するいくつかのクラスを持っています。 BaseModelによって公開される各メソッドは、インスタンス、またはBaseRowクラスを継承する型のインスタンスの配列を返します。現時点で

、私はBaseModelのメソッドとして、タイプ(BaseRowクラスを継承したクラス)を指定する必要がすなわち

using(DeviceModel model = new DeviceModel()) 
{ 
    DeviceRow row = model.Find<DeviceRow>(1); 
    DeviceRow[] rows = model.Get<DeviceRow>(); 
    DeviceRow newRow = model.New<DeviceRow>(); 
} 

、継承クラスを経由してBaseModelに公開されたメソッドを呼び出します/ BaseRowは、BaseRowから継承したもの以外の、それらがどのタイプであるかを知らない/気にしません。私がやりたい何

は、BaseModel継承するすべてのクラスのコードを複製することなく、指定する必要を削除する方法を見つけるすなわち

class DeviceModel : BaseModel 
{ 
    public DeviceRow Find(object param) 
    { 
     return this.Find<DeviceRow>(param); 
    } 
} 

。注:残念ながら、私はすることができませんサードパーティのソリューションを実装または使用すること。つまり、私はCastle Active Record/nHibernateを使用しようとしましたが、正直言って、非常に単純なシステムでなければならないものは非常に大きくて重いです。

私は「あまりにも多くの」詳細を提供していないことを願っています。私が持っているなら、私に知らせてください。

おかげ

+5

あなたの質問にお答えするには、このコードが必要ですか?あなたは少し(または多く)それを簡素化できませんか? – svick

+0

なぜLINQ2SQLを使用しないのですか?あなたが求めるものを正確にするように見えます。 – leppie

+2

あなたにとって難しい問題は、あなたの問題を示す最小限の例を見つけることです。途中で、あなた自身の問題を解決するかもしれません! – ObscureRobot

答えて

2

私があなただったら、私はジェネリッククラスをBaseModel作ることをお勧めしたいです。 「いずれにしても勝てない」という状況では、他人を幸せにするために削除したコードが、あなたがしていることについてもっと教えているかもしれません。(あなたの立場に感謝します。さて、あなたはデバイスモデルで定義した一般的な操作が戻ったり、強く型付けされたデバイスを使用するようにデフォルト設定されます

class DeviceModel : BaseModel<Device> 
{ 
    public override Device New() 
    { 
     return new Device(); 
    } 
} 

:お使いのベースだし、その後、あなたのような相続を持って

class BaseModel<T> 
{ 
    public virtual T[] Get() 
    { 
     // return array of T's 
    } 
    public virtual T Find(object param) 
    { 
     // return T based on param 
    } 
    public virtual T New() 
    { 
     // return a new instance of T 
    } 
} 

。 BaseModelクラスの仮想メソッドに注目してください。基本クラスのメソッドでは、Tやその他のものを使用することを前提とした基本的な操作をいくつか提供するかもしれません。サブクラスでは、より具体的で強く型付けされた動作を定義できます。

私はまた、少し戻ってBaseModelとBaseRowの関係を考えてみてください。コードの匂いになりがちな並列継承階層を定義しているようです(これはコードのほうが便利かもしれませんが、これをどのように使っているかは間違っているかもしれません)。 FooModelを追加するたびにFooRowを追加する必要があるという開発の見通しが進行中である場合、それはしばしば悪い兆候です。

+0

ありがとうエリック、あなたの努力は高く評価されています。私は最初の試みを見て他の人が走った理由を見ることができます。これは、私のデータベーススキーマを強く定義しようとする試みですが、同時に柔軟にします。 BaseModelはデータベースへの読み書きを容易にするための接続性と機能を提供します。 BaseRowは、基礎となるモデルと通信して変更を書き込むメソッドを提供することによって支援します。 ActiveRecord/nHibernateは同じオブジェクトを使用することを余儀なくされました。これは、行が非常に重いことを意味しました。 – Gavin

+0

私はクラスを定義するときにを使って簡単に見ました。ほとんどの場合、解決策になるだろうが、かなりの量のコードを書き直すことが必要になるだろうが、いずれにしても、それはどうにかしなければならないだろう。ありがとう;) – Gavin

+0

助けてくれたらうれしいです。 :) –