次の宣言があるとします。
public class ClassA
{
public string FieldA = "Something first";
}
public class ClassB : ClassA
{
public string FieldB = "Something second";
}
のオブジェクトは、必要なClassB
あらゆる場所で使用できますClassA
。たとえば、メソッド
public void DoSthWithObject(ClassA a);
次のように呼び出すことができます:
ClassB b = new ClassB();
DoSthWithObject(b);
継承された型を親型としてキャストすることもできます。
ClassA a = (b as ClassA);
ClassB
したがって、コンパイラ/フレームワークは、必要な場所のデータを「使用」する方法を知っていますClassA
。
そして今、質問:どうにかして逆にすることは可能ですか? タイプの変数があり、ClassA
それをそのまま使用したいとしますClassB
が、同時にClassB
継承するすべてのフィールドを保持しClassA
、新しいオブジェクトをインスタンス化しないとしますか? ClassA
のフィールドに対応するには、 のオブジェクトに割り当てられたメモリを拡張する必要があることを理解していますClassB
。
簡単に言えば、私は次のようなことをしたいです:
ClassA a = new ClassA();
ClassB b = (a as ClassB); // some magic happens here
(クローン作成メカニズムを実装IConvertible
して使用Convert
または提供できることはわかっていますが、そのようなソリューションは避けたかったのです。)
編集
回答が代替ソリューションの提案に集中しているように思われるので、私は自分の質問を少し変更して報奨金を提案することにしました。
まず第一に、これを言語にとらわれないようにしたい。
2 番目:すべてのツールがハンマーであるとは限らないことを本当に理解しています。また、 JackとJaneを区別できることを願っています。また、基本的な OOP のレッスンも必要ありません (現時点では明らかに気付いていない基本的な概念上の誤りを誰かが実際に証明できない限り)。私が知りたいのは、自動化された親からサブクラスへの変換が論理的に不可能である場合、およびその理由と、それが可能である場合 (そして、コメントから見えるように、可能である言語がある場合)、なぜそれが危険であるか、欠陥に満ちているかです。また、これらの言語で実際に技術的にどのように行われているか、それを「サポート」している (または少なくとも禁止していない) ことも非常に興味深いです。
しかし、私は単なる比喩ではなく、実際のプログラミング例を期待しています。
明確にするために、以前にアップキャストされたオブジェクトのダウンキャストに関する情報を探しているわけではありません。ここではそうではありません。
私が同じテーブル列で同時に集計とグループ化を期待している場合は、これを見せてください。私は理解するのに十分賢いことを知っています。:-) 私は、OOP について私が理解していない基本的な何かがあると感じて、この質問を残したくありません。
知らせ
David's answer の下のコメントで、浮動小数点数について言及していましたが、実際には実数(数学用語) を参照していました。それは私のかなり不完全な英語によるものです。それを拾うのはやめてください。:]
ありがとうございました
皆さんの回答に感謝したいと思います。私はスティーブに報奨金を与えることにしましたが、それは質問が閉じられたと考えているという意味ではありません. 自動化されたオブジェクト変換に対する議論をまだ探しています。私に最も警告していた人たちが、コンバージョンに関連する (そしてキャスティングに関連しない) 明確な例を提供できなかったことに少しがっかりしたことを管理しなければなりません。
私自身の調査から、別の回答でいくつかのことを書き留めることにしました(誰かがそれらを役に立つと思うかもしれません)。リストを自由に編集および拡張してください。