ab.com コミュニティ https://www.activebasic.com/forum/ |
|
Virtualの使い方とOverrideについて https://www.activebasic.com/forum/viewtopic.php?t=2508 |
ページ 1 / 1 |
作成者: | ゲスト [ 2008年12月05日(金) 17:59 ] |
記事の件名: | Virtualの使い方とOverrideについて |
クラスを定義する際のVirtual修飾子はどんな効果があるのでしょうか? サブクラスで実装した(処理を書いた)メソッドをスーパークラスで呼びたいときはAbstract修飾を使いますが・・・ COMインターフェースとかで使うとかは聞きますが、使ったことはありません。 COMインターフェース以外での利用方法などがあればご教授ください。 それとOverrideについても質問です。 (AB5CP3での現象/他のバージョンは未検証) [ここをクリックすると内容が表示されます]
Sub opened(hWnd, pCreateStruct) のように2度以上オーバーライドをした場合、コード: インターフェース的クラス Class cAbstractWindow Public 'ウィンドウプロシージャ Abstract Function wndProc(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT ':::::::: ウィンドウ処理 :::::::: Protected '作成された Abstract Sub opened(hWnd As HWND, pCreateStruct As *CREATESTRUCT) '閉じようとしている Abstract Function closing() As Long '閉じられた Abstract Sub closed() End Class コード: '実装クラス Class cWindow Inherits cAbstractWindow Public 'ウィンドウプロシージャ Override Function wndProc(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT Select Case message Case WM_CREATE opened(hWnd, lParam As *CREATESTRUCT) Case WM_CLOSE If (closing() = TRUE) then DestroyWindow(hWnd) return 0 Case WM_DESTROY closed() (省略) End Select return _eventcallproc(hWnd, message, wParam, lParam) End Function ':::::::: ウィンドウ処理 :::::::: Protected '作成された Override Sub opened(hWnd As HWND, pCreateStruct As *CREATESTRUCT) End Sub '閉じようとしている Override Function closing() As Long return TRUE End Function '閉じられた Override Sub closed() End Sub End Class コード: グローバル領域 Dim wnd As cMainWindow( AddressOf(EventCall_MainWnd) ) Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT return wnd.wndProc(hWnd, dwMsg, wParam, lParam) 'MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function '使用クラス Class cMainWindow Inherits cWindow ':::::::: ウィンドウ処理 :::::::: Protected '作成された Override Sub opened(hWnd As HWND, pCreateStruct As *CREATESTRUCT) addItemEvent(ListView1) End Sub End Class cWindow クラスのメソッドが呼ばれてしまい、最終的にオーバーライドしたクラスのメソッドが呼ばれません。 ついでにいうとスーパークラスでAbstract修飾かInterface定義ではないメソッドを サブクラスでOverrideしようとすると「"Override" の使い方が不正です」とエラーになってしまいます。 そういう仕様ならあきらめますが、どうなのでしょうか? USBメモリに開発環境を入れているので、AB5CP4, CP5は(クラスライブラリの容量から)導入をためらっています。 環境はWinXP_Pro_ver2002SP3+IE6です |
作成者: | ゲスト [ 2008年12月13日(土) 22:24 ] |
記事の件名: | |
ググッたりしてAbstractとVirtualの使い方はなんとなく分かりかけてきました。 が、同時にActiveBasic(旧バージョン?)では↑のバグがあるような記述も見かけました。 もしかしてVirtual関数のオーバーライドあたりにバグがあったりしますか? |
作成者: | イグトランス [ 2008年12月14日(日) 15:45 ] |
記事の件名: | |
たしかに仮想関数・オーバーライド周りはAB5からの機能で,発見されていないバグがある可能性はほかより高いと思うのですが,私にはこの現象を引き起こせませんでした。 ほかの例を見せていただけないでしょうか。 引用: Sub opened(hWnd, pCreateStruct) のように2度以上オーバーライドをした場合、
なお,Virtual/Abstractでもないしインタフェース由来のものでもない関数をOverrideできないというのであればその通りです。逆に言えば,ABではそのような指定のなされた関数だけがオーバーライド可能であるという方針を選んだということです。
cWindow クラスのメソッドが呼ばれてしまい、最終的にオーバーライドしたクラスのメソッドが呼ばれません。 引用: ついでにいうとスーパークラスでAbstract修飾かInterface定義ではないメソッドを
サブクラスでOverrideしようとすると「"Override" の使い方が不正です」とエラーになってしまいます。 |
作成者: | ゲスト [ 2008年12月20日(土) 22:27 ] |
記事の件名: | |
引用: たしかに仮想関数・オーバーライド周りはAB5からの機能で,発見されていないバグがある可能性はほかより高いと思うのですが,私にはこの現象を引き起こせませんでした。
ためしに次のようなコードを書いたのですが、きちんとオーバーライドされました。
ほかの例を見せていただけないでしょうか。 [ここをクリックすると内容が表示されます]
う~ん。適当にクラスを作ってやってみるとちゃんと動作するorzコード: Dim a As Base Dim b As Ext1 Dim c As Ext2 a.msg() b.msg() c.msg() Class Base Public Sub msg() doMsg() End Sub Protected Virtual Sub doMsg() MessageBox(0, "スーパークラス", "Base", MB_OK) End Sub End Class Class Ext1 Inherits Base Protected Override Sub doMsg() MessageBox(0, "サブクラス1", "Ext1", MB_YESNO) End Sub End Class Class Ext2 Inherits Ext1 Protected Override Sub doMsg() MessageBox(0, "サブクラス2", "Ext2", MB_YESNO) End Sub End Class ためしに最新のバージョンをDLして問題のコードを実行したところ正常にオーバーライドできてました>< バージョンアップの際にバグフィックスされたのかもしれません。 最新のは解凍した状態で60メガほどの容量だったので、あまりUSBメモリに入れたくないのですが・・・ 引用: なお,Virtual/Abstractでもないしインタフェース由来のものでもない関数をOverrideできないというのであればその通りです。逆に言えば,ABではそのような指定のなされた関数だけがオーバーライド可能であるという方針を選んだということです。
Abstractなメソッド・処理内容を継承先に丸投げ ・直接のオーバーライド先でのみオーバーライド可能? Virtualなメソッド ・処理内容を変更するサブクラスがある場合にVirtualをつける ・サブクラスAでオーバーライドしたとしても、そのサブクラス(サブクラスAのサブクラス)でさらにオーバーライド可能 といった感じであっているでしょうか? |
作成者: | イグトランス [ 2008年12月28日(日) 00:37 ] |
記事の件名: | |
AbstractとVirtualはそのような感じです。 ただし,ソースコードの外見上AbstractとVirtualでは,そこに関数の実装をかけるかということと,Abstractメンバを実装していないクラスはNew(実体作成)ができないという点が大きく異なります。 逆に,どこでオーバーライドできるかという点においては同じはずです。挙動が違ったらおそらくバグですので是非ご報告ください。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |