私はインターフェイスの共分散に関する私の最後の問題以来、コードに問題がありません。今日私はOLGAthererアーキテクチャーにもう一度アプローチしましたが、私にとって大きな障害が見つかりました。汎用抽象クラスを指すには?
を私は抽象ジェネリッククラスがあります:
abstract class Repository<T> where T : Entity
このクラスは、4つのCRUDメソッドのシグネチャを(追加含んをOK、これをチェックしてみてください:)私は私のためにその巨大なことを願っていますし、私はここで答えています、挿入など)と2つの保護されたフィールド。私が作成するすべてのリポジトリは、このスーパークラスから継承しなければなりません。私は、例えば:
class BookRepository : Repository<Book>
のようなリポジトリを持っています。DBファイルの操作を担当するDBクラスがあります。そして、私の問題があります。私は動的に指定されたタイプのリポジトリを作成したいと思いますが、私は持っている - 私は上記の方法が機能しないことがわかっているが、これは私の問題を可視化する(できれば)
void Add(List<Entity> enitites, Type entityType)
{
Repository<entityType> repo = EntitiesFactory(entityType);
repo.Add(entities);
}
:DBのクラスにこの方法を見てくださいどのようにこれを行うか分かりません。これは常に私の主なOOPの問題です - 私は継承(またはインターフェイスの実装)をコード化することができますが、私はこれらの継承クラスを使用することができませんでした。私にこれを明確にしてください。前もって感謝します。
パヴェル
私はあなたが提供するヒントを使用し、これは私が今持っているものです。
public void Add<T>(List<T> entities, string repoName) where T : Entity
{
Repository<T> repo = RepoFactory<T>(repoName, typeof(T));
repo.Add(entities);
}
private Repository<T> RepoFactory<T>(string repoName, Type t) where T : Entity
{
if (t == typeof(Book))
{
Repository<T> repo = (Repository<T>)((object)(new BookRepository(this.ConnectionString, repoName)));
}
return null;
}
RepoFactoryはで、である(DBクラスになりましたここでは何らかの橋があります) - おそらく他の場所に移動する必要がありますが、ここでは大きな問題ではありません。
まず、RepoFactory本体が適切な方法で実装されているかどうかわかりません。
2番目 - 他のクラスのDBメソッドを呼び出すことを前提としています(わかりやすくするために - WindowsFormとしましょう)。ユーザーの選択に応じてパラメータTでAddを呼び出します。これは問題があり、一時的に修正する状況ですが、DBは問題ありませんが、WindowsFormコードを実装する必要がある場合は、別の時間に遭遇します(私は思っています)。同じ質問ですが、上のレベル(DBの上) - 私はあなたが私を理解することを願っています... Tはユーザの選択に依存するので、私は動的にAddメソッドを呼び出す方法を知らないということを基本的には意味します(OLGAthererは書籍やその他の種類のコレクションをサポートするリポジトリマネージャになる)。そしてユーザーが彼の本のコレクションで作業しようとするなら、私はAdd()メソッドを呼び出さなければならないでしょう。コミックコレクションの場合、Add()。私はコレクションの種類ごとに上記のクラスを書くのではなく、Addの呼び出しを使用してこれを行います。
あなたが私の言いたいことを理解すれば、あなたは本当に良いです:)私の英語はうんざりですが、私はそれに取り組んでいます。 前回のお返事ありがとうございました。今後のお返事ありがとうございます。 Paweł
ええと、私はあなたが車輪を再発明しようとしていると思います。 NHibernateとLinq2Sqlのような十分に開発された選択肢がたくさんある場合、なぜあなた自身のORMを書くのですか? – Juliet
'DB'はGodオブジェクトのように聞こえ、' EntitiesFactory'はサービスロケータのように聞こえます。あなたは、維持されていない、不確実な災害のために自分自身を設定しています。 – jason
こんにちは、これは良いアイデアのように見えるかもしれないことを知っています - 私はまだ学んでおり、OOPのマスタリングには数年かかるでしょう。しかし、もしあなたが私のコードをSourceforgeに置いてみたら、私がまだ作ったアーキテクチャを受け入れるだろうと思っています。とにかくお返事ありがとうございます。 – skrzeczowas