- うきょきょ
- 常連さん
- 会議室デビュー日: 2004/01/09
- 投稿数: 44
|
投稿日時: 2006-09-07 18:13
どこかで見たような気がするのですが、google/ここの過去ログ/どぼんさんのHP等で、
探してみたのですが、キーワードが悪いのか、見つかりませんでした。
参考URL等教えていただけないでしょうか?
Q
サブプロパティが変更された場合、親プロパティのSetが実行されない。
コード: |
|
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim testBBB As BBB = New BBB
testBBB.BBB.AAA = "あいうえお"
End Sub
Public Class AAA
Private FAAA As String
Public Property AAA() As String
Get
Return FAAA
End Get
Set(ByVal value As String)
FAAA = value
Form1.Text = FAAA
End Set
End Property
End Class
Public Class BBB
Private FBBB As AAA = New AAA
Public Property BBB() As AAA
Get
Return FBBB
End Get
Set(ByVal value As AAA)
FBBB = value ' <-実行されない
Form1.Text += "/" + FBBB.AAA ' <-実行されない
End Set
End Property
End Class
End Class
|
|
- ぶさいくろう
- ぬし
- 会議室デビュー日: 2005/11/22
- 投稿数: 1232
- お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
|
投稿日時: 2006-09-07 18:18
あくまで
testBBB.BBB.AAA = "あいうえお"
なんでしょ?
BBBは関係ないじゃん。
testBBB.BBB = new BBB();
でsetterが動かないのは何故だ!ってわめいているのと変わらんよ。
わからんかな?
だいたいサブプロパティってなに?
用語の使い方が違うよ。サブじゃないでしょ。
|
- まりも
- ベテラン
- 会議室デビュー日: 2006/08/19
- 投稿数: 77
|
投稿日時: 2006-09-07 18:32
Setが実行されるのは、
内容が変更されたときではありません。
内容が、=で代入されたときです。
ですから、実行されなくて当然ということですね。
変更されたときに動いてほしいこともありますけど。今のところ無理なのではないかな。
少なくともSetという仕組みでは無理です。
[ メッセージ編集済み 編集者: まりも 編集日時 2006-09-07 18:35 ]
|
- burton999
- ぬし
- 会議室デビュー日: 2003/10/06
- 投稿数: 898
- お住まい・勤務地: 東京
|
投稿日時: 2006-09-07 18:35
クラスAAAにプロパティAAAが変更された場合に発生させるイベントを作って
クラスBBBはクラスAAAをNewした時に、そのイベントにコールバックメソッドを設定すれば可能です。
#追記
もちろんプロパティBBBのセッターの処理は実行されないので
コールバックメソッドに処理を書く必要があります。
[ メッセージ編集済み 編集者: burton999 編集日時 2006-09-07 18:46 ]
|
- うきょきょ
- 常連さん
- 会議室デビュー日: 2004/01/09
- 投稿数: 44
|
投稿日時: 2006-09-08 10:49
To:ぶさいくろうさん
(testBBB.BBB)プロパティの(AAA)プロパティって意味で使いました。
MSDNの「プロパティの概要」を読み直していて、そこで出てきます。
To:まりもさん
確かにその通りでした。
この考え方だと、セッターが実行されなくて当たり前なんですよね。
一応burton999さんの方法で、期待通りできたので良いかなって思っています。
To:burton999さん
引用: |
|
クラスAAAにプロパティAAAが変更された場合に発生させるイベントを作って
クラスBBBはクラスAAAをNewした時に、そのイベントにコールバックメソッドを設定すれば可能です。
|
上記の方法で、期待通り動きました。
以下検証コードを記します。
コード: |
|
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim testBBB As BBB = New BBB
testBBB.BBB.AAA = "あいうえお"
End Sub
Public Class AAA
Public Event SetAAAEvent(ByVal value As AAA)
Private FAAA As String
Public Property AAA() As String
Get
Return FAAA
End Get
Set(ByVal value As String)
FAAA = value
Form1.Text = FAAA
RaiseEvent SetAAAEvent(Me)
End Set
End Property
End Class
Public Class BBB
Private FBBB As AAA
Public Sub New()
FBBB = New AAA
AddHandler FBBB.SetAAAEvent, AddressOf SetAAAEvent
End Sub
Private Sub SetAAAEvent(ByVal value As AAA)
FBBB = value
Form1.Text += "/" + FBBB.AAA
End Sub
Public Property BBB() As AAA
Get
Return FBBB
End Get
Set(ByVal value As AAA)
Me.SetAAAEvent(value)
End Set
End Property
End Class
End Class
|
|
- 梶
- ベテラン
- 会議室デビュー日: 2005/05/16
- 投稿数: 85
- お住まい・勤務地: 千葉県在住
|
投稿日時: 2006-09-08 11:00
引用: |
|
うきょきょさんの書き込み (2006-09-08 10:49) より:
To:ぶさいくろうさん
(testBBB.BBB)プロパティの(AAA)プロパティって意味で使いました。
MSDNの「プロパティの概要」を読み直していて、そこで出てきます。
|
MSDNみてみました。
これの事みたいですね。
引用: |
|
プロパティのデータ型が列挙型の場合、Microsoft Visual Studio などの開発環境では、そのプロパティは [プロパティ] ウィンドウにドロップダウンリストとして表示されます。プロパティのデータ型が、いくつかのプロパティを持つクラスである場合、クラスに含まれているこれらのプロパティは、定義するプロパティのサブプロパティと呼ばれます。Visual Studio の [プロパティ] ウィンドウでは、プロパティを展開してそのサブプロパティを表示できます。
|
|