- ベストアンサー
VB6のコードをC#に置き換える際のオブジェクト指向の問題
- VB6のコードをC#に置き換える際のオブジェクト指向の問題について質問です。VB6で記述されたコードをC#に置き換える際に、それぞれのクラスに工夫を加えることなくメソッドを実行する方法を教えてください。
- VB6のコードをC#に置き換える際に、異なるクラスを受け取ってメソッドを実行する方法について質問です。現在のVB6のコードでは、引数の値によって異なるクラスのオブジェクトを受け取り、そのオブジェクトのメソッドを実行しています。しかし、C#ではオブジェクト指向の厳密さから、そのまま置き換えることができません。どのようにコードを書けば同様の動作を実現できるでしょうか?
- VB6のコードをC#に置き換える際に、異なるクラスを受け取ってメソッドを実行する方法について質問です。VB6のコードでは、引数の値によって異なるクラスのオブジェクトを受け取り、そのオブジェクトのメソッドを実行していますが、C#ではそのまま置き換えることができません。よりスマートな方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> call obj.run() 問題はこれ。 C#では、この「メンバ関数(※1、脚注参照)の呼び出し」が、最も問題となるでしょう。 >ようは引数の値によって、メソッドやプロパティの形は同じだけれど、 >メソッドの中身が違うクラスをもらって、そのもらったクラスのメソッド >を実行したいわけです。 C#の場合、クラスオブジェクトの中のメンバ関数を呼ぶと「このクラスに定義された、○○って名前の関数は、ここにあるから、これを呼び出すように」と言うのが「実行時ではなく、コンパイル時に」決定されます。 ですので「呼び出すたびに、呼ぶべきアドレスが変化する場合」には「関数へのポインタ」を介して呼ばねばなりません。 >こういうクラス構成にすれば、とか教えていただければ助かります。 基本クラスを作成し、そのクラスの中に「プライベート(※2)なメンバ関数」と「パブリック(※3)な関数へのポインタ変数」を作成して下さい。 そして、その基本クラスを元に複数の派生クラスを生成し、プライベートなメンバ関数をオーバーライドして上書きし、パブリックな関数へのポインタ変数を下位クラスに継承して下さい。 クラスオブジェクトを生成する場合は、newで派生クラスのオブジェクトを生成し、それを基本クラス型に型キャストし、基本クラスのクラスオブジェクト変数に代入します。 なお、派生クラスの定義では、コンストラクタ部分のコードで「パブリックな関数へのポインタ変数に、プライベートなメンバ関数のアドレスがロードされる」ようにしておきます。 で、呼び出し時は「基本クラスのオブジェクトに型キャストし、パブリックな関数へのポインタ変数を使用して呼び出し」して下さい。 なお「ここに書いてある事の一部でも理解できない場合」には「実装は不可能」です。 蛇足ですが、当方がこの実装を誰か頼まれたとしたら「今までに頼まれた中で、めんどくさい実装ベスト10」に入るのは間違い無いです。 ----脚注---- ※1)メンバ関数 C#では「メソッド」を「メンバ関数」と呼びます。なぜなら「メンバでない関数」が存在するからです。 ※2)プライベート クラス内からのみ参照できる変数や関数の事。プライベートな関数は、クラス内のメソッドの中からしか呼べない。 ※3)パブリック クラスの外から参照できる変数や関数の事。
お礼
回答ありがとうございます。返答が遅れました。 やはり基本的にはクラス側の方で対処しなくてはならないのですね。。。 いわれている事はある程度理解出来たのですが、あまり複雑なことはお願いしづらい為、どうすべきなのかもう少し考えてみます。 ありがとうございました。
補足
あれから多少、自力でも調査していたのですが、こちらは抽象クラスを作って継承してもらえば良いのでしょうか? public abstract class objmoto { public abstract void run(); } public abstract class obj1 : objmoto { public override void run() { 処理1; return; } } public abstract class obj2 : objmoto { public override void run() { 処理2; return; } } public void aa(int i) { objmoto obj = bb(i); obj.run(); } public object bb(int i) { switch (i) { case 1: return obj1; case 2: return obj2; } } のような形になればいいのでしょうか?