tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル1つの変数で複数クラスを引き受ける
記事No1959
投稿日: 2005/08/05(Fri) 10:32
投稿者さくら
[OSのVer]:Windows    [VBのVer]:VB.NET  

親クラス BASE_Class
を継承した子クラスが
Property Prop_A を持っている Class_A
Property Prop_B を持っている Class_B
Property Prop_C を持っている Class_C
の3つあったとします。

フォームのボタンを押されたときにプログラム中の条件によって子クラスのうちどちらかをNewして操作したいと思います。
----------------------------------------
Private Sub get_class(ByRef target)
    If Me.RadioButton1.Checked Then
        target = New Class_A
    ElseIf Me.RadioButton2.Checked Then
        target = New Class_B
    Else
        target = New Class_C
    End If

    Return target
End Sub
----------------------------------------
として
----------------------------------------
Dim tmp As BASE_Class
get_class(tmp)
If Me.RadioButton1.Checked then
    tmp.Prop_A = ****
ElseIf Me.RadioButton2.Checked then
    tmp.Prop_B = ****
        :
----------------------------------------
などとしたいのですが、実際にはtmpに対してCTypeでキャストしてからでないと子クラス特有のプロパティを操作することができません。

そこで、tmpとは別に、get_classでNewされるオブジェクトを引き受ける変数をDimしておいて、型はget_classで作られた型を参照して
----------------------------------------
Dim tmp As BASE_Class
get_class(tmp)
Dim act As New tmp.TypeOf()
----------------------------------------
みたいなことをしようとしているのですが、これでは3行目が通りません。

候補となりうる子クラス分のDimだけ書いておいて、get_classで返ってきたtmpの型を見て必要なぶんの子クラスだけNewすればできたのですが、実際には子クラスもプロパティももっとたくさんあるので、できれば1つの変数で受けたいと思っています。
どうしたらすっきりできるのでしょうか?
それともそもそもこういうやり方をしようとすること自体間違っているのでしょうか?

[ツリー表示へ]
タイトルRe: 1つの変数で複数クラスを引き受ける
記事No1962
投稿日: 2005/08/05(Fri) 20:35
投稿者じゃんぬねっと
参照先http://jeanne.wankuma.com/
> それともそもそもこういうやり方をしようとすること自体間違っているのでしょうか?

コンパイル解決ができない仕様は基本的に見直すべきです。
設計上、この 3 つの基底クラスは同一でなければなりません。
Object を使っても良いですが...

どちらにしても、GetType() は必要です。

[ツリー表示へ]
タイトルRe^2: 1つの変数で複数クラスを引き受ける
記事No1964
投稿日: 2005/08/08(Mon) 10:43
投稿者さくら
> コンパイル解決ができない仕様は基本的に見直すべきです。
> 設計上、この 3 つの基底クラスは同一でなければなりません。
> Object を使っても良いですが...

お返事どうもありがとうございます。
やはりそうですか…
データベースを操作するためのクラスが1テーブルに対して1クラス用意されていて、
各々のフィールドをプロパティとして公開しているために基底クラスで吸収させることが
できずにいます。
画面の状態によって操作対象となるテーブルが変わるので、そこをなんとかうまく
まとめることはできないかな、と思ったのですが、結局処理対象のフィールドも
変わるわけですし、変数がまとまっていたところで操作するためのコードは結局
Ifで分岐させたりしなくちゃいけないんですよね。

ちょっと、根本的に見直したほうがよさそうです。
踏ん切りがつきました。
どうもありがとうございました。

[ツリー表示へ]
タイトルRe^3: 1つの変数で複数クラスを引き受ける
記事No1970
投稿日: 2005/08/09(Tue) 12:24
投稿者じゃんぬねっと
参照先http://jeanne.wankuma.com/
こんにちは、じゃんぬ です。

> 各々のフィールドをプロパティとして公開しているために基底クラスで吸収させることが
できずにいます。

インターフェイスという便利なものはご存知ですか?

[ツリー表示へ]
タイトルRe^4: 1つの変数で複数クラスを引き受ける
記事No1972
投稿日: 2005/08/10(Wed) 15:24
投稿者さくら
> インターフェイスという便利なものはご存知ですか?

知りませんでした。
ヘルプで見てみたところ使えそうなので、試しに使って実装してみます。
ご親切にどうもありがとうございます。

[ツリー表示へ]