|
2017/04/21(Fri) 10:26:25 編集(投稿者)
■No83897 (Oboe2001 さん) に返信 > VB6までは、Typeで宣言すれば入れ子構造を作ることができました。VB.NET以降では > TypeではなくStructureやClassを使えば良さそうだ、ということまでは分かりました。
VB4〜VB6 でも、クラスの入れ子はできますね。 Class ステートメントではなく、*.cls ファイルでの宣言になりますが。
> しかしながら、「食材」のところで、「BC30053 配列を'New'で宣言することはできま > せん」と怒られてしまいます。
要素数を指定して宣言すれば、それだけで配列のインスタンスが生成されますので、 New を使う必要が無いという事です。下記の 4 つはいずれも同じ意味です。
★案1★ Public Class Cls_Food Public Fruit(1) As Cls_Fruit Public Vegitable(1) As Cls_Vegitable End Class
★案2★ Public Class Cls_Food Public Fruit() As Cls_Fruit Public Vegitable() As Cls_Vegitable Public Sub New() ReDim Fruit(1), Vegitable(1) End Sub End Class
★案3★ Public Class Cls_Food Public Fruit() As Cls_Fruit = New Cls_Fruit() {Nothing, Nothing} Public Vegitable() As Cls_Vegitable = New Cls_Vegitable() {Nothing, Nothing} End Class
★案4★ Public Class Cls_Food Public Fruit() As Cls_Fruit = New Cls_Fruit(1) {} Public Vegitable() As Cls_Vegitable = New Cls_Vegitable(1) {} End Class
> Food.Fruit(1).Apple(7) = 100 ……のような使い方をしたいのですが、 Cls_Fruit が、VB.NET の「構造体(Strucutre)」や VB6 の「ユーザー定義型(Type)」ではなく、 Cls_Fruit が、VB.NET の「クラス(Class)」や VB6 の「クラス」として宣言されていた場合、 単に配列を確保しただけでは、個々の要素の初期値は Nothing になっています。
ですからクラスの配列であった場合には、VB6 でいうところの ReDim Food.Fruit(1) Set Food.Fruit(0) = New Cls_Fruit Set Food.Fruit(1) = New Cls_Fruit のような処理が事前に必要です。
配列要素の初期化も併せて行うならこんな感じ。 今回は 0 To 1 な 2 要素な配列だけなので、直接書いてみます。
★案5★ Public Class Cls_Food Public Fruit() As Cls_Fruit = {New Cls_Fruit(), New Cls_Fruit()} Public Vegitable() As Cls_Vegitable = {New Cls_Vegitable(), New Cls_Vegitable()} End Class
配列の要素数が多い場合は、初期化処理をコンストラクタ内で ループ生成した方が良いでしょう。
|