new
サブクラスのメンバーを再定義して、より具体的な戻り値の型を利用できるようにするために使用することを検討しています。問題は、これは良い考えなのか、それともトラブルを求めているのかということです。
解決すべき問題は、いくつかの「ミラー化された」クラス階層があり、すべての階層層の型が別の階層の同じレベルを参照している場合です。説明が難しいので、以下に例を示します。
class A1 {}
class A2 : A1 {}
class A3 : A2 {}
abstract class B1
{
protected A1 myA;
A1 MyA { get { return myA; } }
}
abstract class B2 : B1
{
new A2 MyA { get { return (A2)myA; } }
}
class B3 : B2
{
new A3 MyA
{
get { return (A3)myA; }
set { myA = value; }
}
}
他のすべてのレベルと同様に、抽象的な「レベル」1 ( A1
/など) のみを処理するコードがあります。B1
各「レベル」がタイプをできるだけ具体的に見るといいでしょう。現在、最上位レベルで型を定義し、呼び出しコードで常にダウンキャストしています。別の名前を使用して、ある「レベル」に別のメンバーを追加することがあります。これにより、より多くの冗長なメンバーが発生します。きれいにしたい。
(ジェネリックはここではオプションではありません。B2
知らなければ役に立たないからですB3
(そこに追加のインターフェースが必要になります)。また、多くのタイプがある場合(たとえば、C1/2/3、D1/2/3 ...)一般的な引数が多すぎます。技術的には機能しますが、非常に複雑になります。)
さらに、これらのクラスの一部をシリアライズし ( DataContractSerializer
)、一部を NHibernate を使用してデータベースにマップします。
誰かがすでにこのようなことをしましたか?おすすめですか?同じ種類の問題を解決するための他のアプローチはありますか?
編集: キャストとプロパティの実装に関する議論のため、コードを少し変更しました。これは実際にはここでの質問ではありません。短い例を作成するために、できるだけ少ないコードを記述しようとしました。