2009-08-16 8 views
2

特定のオブジェクトを動的に継承し、app.configファイルのような特別な設定で設定します。ここでC#で継承を動的にすることはできますか?

は一例です:

//PROGRAM A 
public class MySuperClass : OldIneritanceObjectVersion 
{ 
     ........Stuff Goes Here 
} 


//PROGRAM B 
public class MySuperClass : OldIneritanceObjectVersion 
{ 
     ........Stuff Goes Here 
} 

//PROGRAM B .....a Few Years Later..... 
public class MySuperClass : NewIneritanceObjectVersion 
{ 
     ........Stuff Goes Here 
} 

あなたが推測できるように、私はOldIneritanceObjectVersionを使用して維持するために私の古いものをしたい、私は私が作成した新しいものが欲しいだけでなく、より多くの更新NewIneritanceObjectVersionを使用するために、古いものを更新中。これを動的に行う方法はありますか?

答えて

5

いいえC#は静的に型指定されています。コンパイル時に各クラスの型階層を知っていなければなりません。

2

T4でこれを行う可能性があります。クラスのテンプレートをセットアップして、この動作を簡単に変更できます。

これは実行時の構成ではなく、コンパイル時の構成になります。実行時にこれを(簡単に)行う方法はありません。実行するたびに動的に型を生成することや、メモリアセンブリ内にいくつかの型を持たない方法はありません。


ここにもう一つの思想 -

あなたは制御の反転と依存性注入を使用して経由して、この目標に向かって同じ効果や仕事を成し遂げることができました。あなたのクラスを基本クラスまたはインターフェイスに依存させるだけです。これにより、後で、実行時に、設定や他の多くの手法を使って実装を変更するのが非常に簡単になります。

1

"基本クラス"を別のDLLにエクスポートし、プロジェクトで参照することができます。次に、このDLLの新しいバージョンをお持ちの場合は、古いDLLを置き換えるだけです。

しかし、これを行うことで、ベースクラスの名前を同じにしなければならず、新しいバージョンにはまったく置き換えられます。それは問題ではないはずです。

0

あなたはこれを試すことができます... OldInheritanceObjectVersionのサブクラスのどこにでもinhertiance構造を変更しないでください。代わりに、OldInhertianceObjectVersionの継承構造を1か所で変更してください!

//NewInheritanceObjectVersion 
public class NewInheritanceObjectVersion 
{ /* 
     ...Move original stuff from OldInheritanceObjectVersion to this class here 
     ...with any new stuff/changes here. Should probably maintain backwards 
     ...compatibility with OldInheritanceObjectVersion if we can 
     ...(or OldInhertianceObjectVersion can be an adapter that maintains backwards 
     ... compatibility and adapts/delegates to this class) 
    */ 
} 

//OldInheritanceObjectVersion 
public class OldInheritanceObjectVersion : NewInheritanceObjectVersion 
{ /* 
     ...Since old and new stuff is implemented in NewInheritanceObjectVersion 
     ...this is simply a "pass-through" class so that all classes that inherit 
     ...from this class get old and new behavior without changing their inheritance 

     ...worst case, this class can expose the old interface/class definition and 
     ...delegate/adapt the methods/properties to the new 
     ...features in NewInheritanceObjectVersion 
     ...if NewInheritanceObjectVersion does not implement them directly 
    */ 
} 

//PROGRAM B .....a Few Years Later..... 
public class MySuperClass : OldInheritanceObjectVersion 
{ /* 
     ........Without changing this at all, we get all old behavior 
     ........and we can update it to take advantage of new features as well 
    */ 
} 
+0

これと単に変更OldInheritanceObjectVersionの違いは何ですか? –

+0

実際に悪い点ではありません。私が質問を見直すと、実際にはそれほど意味をなさないと思われ、トップの答えは本当にすべてを言います。 –

0

本質的には、新しい具体的な実装に依存して継承チェーンを変更しています。これは匂いがしていて、ある種のコードでは可能かもしれないが、私はこれを試みたことはなく、ジョンSに同意する傾向がある - それに対して私は強く助言するだろう。

新しいアイテムを継承チェーンに挿入する必要があると心配しているなら、 "OldInheritenceObjectVersion"でカプセル化を行い、Dependency Injectionを通じて実際の実装を注入します。

私はまだこれに慣れていませんが、あなたが拘束され、継承によってこれを行うと決めた場合、おそらく最も抵抗の少ない経路です。

0

私はこのスレッドがかなり古いことを知っていますが、多分この回答は今後誰かを助けるでしょう。

はい、可能です。今日は単なる動的継承ではなく、複数の継承さえも可能です(同時に両方でも)。ミックスインについて聞いたことがありますか?

あなたの問題を解決する1つの方法はre-motionかもしれないが、オープンソースの開発フレームワーク(C#のでミックスインを使用してのように、優れた機能の多くを提供します):

関連する問題