C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 173 を表示中)
■99811 / )  Re[4]: クラスが作れません。
□投稿者/ 魔界の仮面弁士 (3388回)-(2022/06/07(Tue) 16:17:13)
No99810 (魔界の仮面弁士) に追記
> もしも
>  nd.Data = Array(1.2, 3.4)
> と
>  nd.Data(0) = 1.2
>  nd.Data(1) = 3.4
> の両方を可能にしたいのであれば、
> Data プロパティの定義をそのように書き換えるか、

上記の両方を可能にしたサンプル。
手抜き実装ですけど。


Option Explicit
Private m_data As Variant
Private Sub Class_Initialize()
  ReDim m_data(0 To 10) As Double
End Sub
Public Property Get Data(Optional ByVal index As Variant) As Variant
  If IsMissing(index) Then
    Data = m_data
  Else
    Data = m_data(index)
  End If
End Property
Public Property Let Data(Optional ByVal index As Variant, ByVal newValue As Variant)
  If IsMissing(index) Then
    If IsArray(newValue) Then m_data = newValue
  Else
    m_data(index) = newValue
  End If
End Property


-----

Dim nd As clsNameData
Set nd = New clsNameData

'検証のため、現在のデータ型と要素数を確認しておきます。
' この段階では「Double()」「0」「10」と表示されます。
Debug.Print TypeName(nd.Data), LBound(nd.Data), UBound(nd.Data)

'★1:添字を指定して、メンバーを個別に代入できます。
' この時、配列のデータ型に合わせて暗黙の型変換が発生します。
nd.Data(0) = 123.456! 'Single 型の 123.456 ではなく、Double 型の 123.456001281738 が代入される
nd.Data(1) = "125D-1" 'String 型の 125D-1 ではなく、Double 型の 12.5 が代入される

Stop

'★2:添字を指定していない場合は、配列全体を一括代入できます。
' 場合によっては、データ型やメンバー数のチェックも行った方が良いでしょう。
nd.Data = Array(1, 2, 3, , 5)

'現在はデータ型やメンバー数をノーチェックで差し替えているため、
' 「Variant()」「0」「4」に変化してしまいました。
Debug.Print TypeName(nd.Data), LBound(nd.Data), UBound(nd.Data)

Stop

'★3:添字を指定して、メンバーを個別に代入できます。
' 先の1と同じ処理ですが、配列のデータ型が変化したため、先ほどと異なる結果になります。
nd.Data(0) = 123.456! 'Single 型の 123.456 がそのまま代入される
nd.Data(1) = "125D-1" 'String 型の 125D-1 がそのまま代入される



あくまでも「data(0 To 10) As Double」な形を維持したいのであれば、
Property Let の段階で「If IsArray(newValue) Then m_data = newValue」という
『配列全体の差替え行為』ではなく、個々の「配列の要素を差し替え」るようにします。
返信 編集キー/


管理者用

- Child Tree -