これが奇妙なことなのかどうか、あるいは何らかのコード臭なのかはわかりませんが、基本型をその派生型の形式に「キャスト」する方法 (なんらかの OOP パターンがあると便利です) があるかどうか疑問に思っていました。派生型には親が提供していない追加機能があり、それ自体は根本的に健全ではないため、これはあまり意味がないことはわかっています。しかし、これを行う方法はあるのでしょうか? ここに、私が尋ねていることをよりよく説明できるコード例を示します。
public class SomeBaseClass {
public string GetBaseClassName {get;set;}
public bool BooleanEvaluator {get;set;}
}
public class SomeDerivedClass : SomeBaseClass {
public void Insert(SqlConnection connection) {
//...random connection stuff
cmd.Parameters["IsItTrue"].Value = this.BooleanEvalutar;
//...
}
}
public static void Main(object[] args) {
SomeBaseClass baseClass = new SomeBaseClass();
SomeDerivedClass derClass = (SomeDerivedClass)baseClass;
derClass.Insert(new sqlConnection());
}
これは馬鹿げているように思われるかもしれませんが、このようなことを実現する方法はあるのでしょうか?
ベストアンサー1
「管理された」言語では健全ではない。これはダウンキャスト、そして、まさにあなたが説明した理由により、それを処理する健全な方法はありません (サブクラスは基本クラスよりも多くのものを提供します - この「より多くの」はどこから来るのでしょうか?)。特定の階層で同様の動作を本当に必要とする場合は、基本型をプロトタイプとして受け取る派生型のコンストラクターを使用できます。
リフレクションを使用して、単純なケース (追加の状態を持たないより具体的な型) を処理するものを構築することもできます。一般的には、問題を回避するために再設計するだけです。
編集: うわっ、基本型と派生型の間の変換演算子を記述できない。Microsoft が自分自身から「ユーザーを保護」しようとしているのは奇妙だ。まあ、少なくとも Sun ほどひどいわけではない。