tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルイベントの継承ができない?
記事No7257
投稿日: 2008/03/28(Fri) 15:02
投稿者ダンボ
Createdというイベントを持つ基本クラスBaseDefを継承したShelfDefに対して、
下記のようにコーディング(関連部分だけ記載)したのですが、実行しても
Shelf_Createdが呼出されません。(泣)
どこが悪いのでしょうか?

(基本クラス)
Public MustInherit Class BaseDef
    Public Event Created(ByVal sender As Object, ByVal e As EventArgs)
    Private innerDefFileFullpath As String
    Sub New(ByVal DefFileFullPath As String)
        innerDefFileFullpath = DefFileFullPath
        RaiseEvent Created(Me, New EventArgs)
    End Sub
End Class

(派生クラス)
Public Class ShelfDef
    Inherits BaseDef
    Sub New(ByVal DefFileFullPath As String)
        MyBase.New(DefFileFullPath)
    End Sub
End Class

(利用側クラス)
Dim WithEvents Shelf As ShelfDef
Shelf = New ShelfDef(DefFileFullPath)    'これを実行することによりShelf_Createdが呼ばれる筈

Private Sub Shelf_Created(ByVal sender As Object, ByVal e As EventArgs) Handles Shelf.Created
    Shelf.Open()
End Sub

[ツリー表示へ]
タイトルRe: イベントの継承ができない?
記事No7258
投稿日: 2008/03/28(Fri) 16:43
投稿者Hongliang
WithEvents/Handles は実装を隠蔽されてしまうので分かりづらいですね。
そこで手で展開してみました。コンパイル後はこういう風になっています。

Shelf = New ShelDef(DefFileFullPath)
AddHandler Shelf.Created, AddressOf Shelf_Created

ご覧の通り、コンストラクタを呼び出した時点ではまだ Created イベントに Shelf_Created を挿入できていません。

[ツリー表示へ]
タイトルRe^2: イベントの継承ができない?
記事No7259
投稿日: 2008/03/28(Fri) 16:52
投稿者y4yama
> Shelf = New ShelDef(DefFileFullPath)
> AddHandler Shelf.Created, AddressOf Shelf_Created

HELPでは、
Handles キーワードと AddHandler ステートメントのどちらを使用しても、特定のプロシージャが特定のイベントを処理することを指定できますが、この 2 つには違いがあります。プロシージャを定義して、それが特定のイベントを処理することを指定する場合は、Handles キーワードを使います。一方、AddHandler ステートメントは実行時にプロシージャをイベントに関連付けます。詳細については、「AddHandler ステートメント」を参照してください。

カスタム イベントの場合は、プロシージャがイベント ハンドラとして追加されたときに、アプリケーションがイベントの AddHandler アクセサを呼び出します。

ということなんですね。勉強になりました。
だから、Newの所で RaiseEvent Created・・は不可能なのではないか、と。

[ツリー表示へ]
タイトル[解決]イベントの継承ができない?
記事No7260
投稿日: 2008/03/28(Fri) 17:00
投稿者ダンボ
Hongliang さん、y4yama さんどうもありがとうございます。

Form_Load時に強引に
  AddHandler Shelf.Created, AddressOf Shelf_Created
を実行したら、
'System.NullReferenceException' の初回例外が発生しました。
ですって(無謀だった)

New実行時点ではイベント処理はできないってことですか?
インスタンスができてから始めてイベント処理も使える様になると。
Newメソッドの内部にいるうちはまだインスタンスができあがっていないから
いくらRaiseEvent出しても受け付ける準備ができていないということですか。
原理的に。。不可能。。なんですね。

Newメソッドと呼ばずにコンストラクタと呼ぶ由縁が分かるような気がしました。

[ツリー表示へ]