ここから本文です

VB.NETでsharedを使うのはあまりよくないとの事ですが、内部クラスから上位クラス...

zak********さん

2012/11/1220:52:52

VB.NETでsharedを使うのはあまりよくないとの事ですが、内部クラスから上位クラスの変数を使う必要があって参照してます。
逆にsharedが駄目だと内部クラスのメソッドすら呼べませんよね?

ンスタンス作りたくても内部クラスのインスタンスは作れないので、どう扱うのがいいのでしょうか?
sharedを使わずに内部クラスのメソッドをどう呼ぶのか知りたいです。

補足内部のクラスから上位クラスのメソッドはどう参照するんでしょうか?
メソッドはprivateです。

閲覧数:
42,334
回答数:
1

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

編集あり2012/11/1222:48:21

VB.NET で shared というのは、C# や C++ でいうところの static メンバーです。なので、これはインスタンスには無関係ということになります。

【逆にsharedが駄目だと内部クラスのメソッドすら呼べませんよね?】

インスタンス化すれば呼べますよ。


Public Class Form1
Private Class Sample
Dim a As Integer
Public Sub Test()
a = a + 1
End Sub
End Class

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x As Sample
x = New Sample 'インスタンス化
x.Test()
End Sub
End Class


逆に、インスタンス化していないのに呼び出せている時点で、それは単なる名前空間+外部変数(static変数)の様相を呈しているということです。

それで困っていなければ構いません。そういう応用だということで、何も問題なし。

けれども、そのクラスでインスタンスを複数持ちたいという場面がある時、shared ではまったく対応できないということです。

上のコード例で言えば、

Dim x As Sample
Dim y As Sample

x = New Sample
y = New Sample

とすれば、Sample クラスのインスタンスが二つ(x と y)できました。それで、x.Test() とか、 y.Test() とかいうようにして、インスタンスごとのメソッドを呼び出すという使い方になります。そしてもちろん、メンバー変数の a も、インスタンスごとに存在する。つまり、x.a、y.a ということで別の存在。

Shared の場合は Sample.Method とか、Sample.n とかいう形で、そこにはインスタンスの区別がまったく無いわけです。

なお、繰り返しになりますが、それで良ければ何も問題なし。不都合が無ければ、Sharedのままで構いません。


◆◆◆◆◆◆ 補足を拝見しました ◆◆◆◆◆◆

【内部のクラスから上位クラスのメソッドはどう参照するんでしょうか?メソッドはprivateです。 】

内部クラスを次のように定義したとします。ここで、Form1 は上位クラスです。

Private Class Sample
Public Sub Test(ByVal x As Form1)
x.Alpha()
End Sub
End Class

これを上位クラスから呼び出します。

Dim x As Sample = New Sample
x.Test(Me)

自身のインスタンスを渡します。この時、Me というキーワードを使います。これは C# や C++ だと this です。

内部クラス側は、このインスタンスを使って Alpha という上位クラスのメソッドを呼び出します。Alpha メソッドは private で構いません。


参考になりましたでしょうか?

この回答は投票によってベストアンサーに選ばれました!

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる