作成者 |
メッセージ |
|
|
AbstractとVirtualはそのような感じです。
ただし,ソースコードの外見上AbstractとVirtualでは,そこに関数の実装をかけるかということと,Abstractメンバを実装していないクラスはNew(実体作成)ができないという点が大きく異なります。
逆に,どこでオーバーライドできるかという点においては同じはずです。挙動が違ったらおそらくバグですので是非ご報告ください。
AbstractとVirtualはそのような感じです。 ただし,ソースコードの外見上AbstractとVirtualでは,そこに関数の実装をかけるかということと,Abstractメンバを実装していないクラスはNew(実体作成)ができないという点が大きく異なります。 逆に,どこでオーバーライドできるかという点においては同じはずです。挙動が違ったらおそらくバグですので是非ご報告ください。
|
|
|
投稿記事 |
Posted: 2008年12月28日(日) 00:37 |
|
|
|
|
|
引用: たしかに仮想関数・オーバーライド周りはAB5からの機能で,発見されていないバグがある可能性はほかより高いと思うのですが,私にはこの現象を引き起こせませんでした。
ほかの例を見せていただけないでしょうか。
ためしに次のようなコードを書いたのですが、きちんとオーバーライドされました。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 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
う~ん。適当にクラスを作ってやってみるとちゃんと動作するorz
ためしに最新のバージョンをDLして問題のコードを実行したところ正常にオーバーライドできてました><
バージョンアップの際にバグフィックスされたのかもしれません。
最新のは解凍した状態で60メガほどの容量だったので、あまりUSBメモリに入れたくないのですが・・・
引用: なお,Virtual/Abstractでもないしインタフェース由来のものでもない関数をOverrideできないというのであればその通りです。逆に言えば,ABではそのような指定のなされた関数だけがオーバーライド可能であるという方針を選んだということです。
Abstractなメソッド
・処理内容を継承先に丸投げ
・直接のオーバーライド先でのみオーバーライド可能?
Virtualなメソッド
・処理内容を変更するサブクラスがある場合にVirtualをつける
・サブクラスAでオーバーライドしたとしても、そのサブクラス(サブクラスAのサブクラス)でさらにオーバーライド可能
といった感じであっているでしょうか?
[quote="イグトランス"]たしかに仮想関数・オーバーライド周りはAB5からの機能で,発見されていないバグがある可能性はほかより高いと思うのですが,私にはこの現象を引き起こせませんでした。 ほかの例を見せていただけないでしょうか。 [/quote]
ためしに次のようなコードを書いたのですが、きちんとオーバーライドされました。 [hide][code]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 [/code][/hide] う~ん。適当にクラスを作ってやってみるとちゃんと動作するorz
ためしに最新のバージョンをDLして問題のコードを実行したところ正常にオーバーライドできてました>< バージョンアップの際にバグフィックスされたのかもしれません。 最新のは解凍した状態で60メガほどの容量だったので、あまりUSBメモリに入れたくないのですが・・・
[quote="イグトランス"]なお,Virtual/Abstractでもないしインタフェース由来のものでもない関数をOverrideできないというのであればその通りです。逆に言えば,ABではそのような指定のなされた関数だけがオーバーライド可能であるという方針を選んだということです。 [/quote]
Abstractなメソッド ・処理内容を継承先に丸投げ ・直接のオーバーライド先でのみオーバーライド可能?
Virtualなメソッド ・処理内容を変更するサブクラスがある場合にVirtualをつける ・サブクラスAでオーバーライドしたとしても、そのサブクラス(サブクラスAのサブクラス)でさらにオーバーライド可能
といった感じであっているでしょうか?
|
|
|
投稿記事 |
Posted: 2008年12月20日(土) 22:27 |
|
|
|
|
|
たしかに仮想関数・オーバーライド周りはAB5からの機能で,発見されていないバグがある可能性はほかより高いと思うのですが,私にはこの現象を引き起こせませんでした。
ほかの例を見せていただけないでしょうか。
引用: Sub opened(hWnd, pCreateStruct) のように2度以上オーバーライドをした場合、
cWindow クラスのメソッドが呼ばれてしまい、最終的にオーバーライドしたクラスのメソッドが呼ばれません。
なお,Virtual/Abstractでもないしインタフェース由来のものでもない関数をOverrideできないというのであればその通りです。逆に言えば,ABではそのような指定のなされた関数だけがオーバーライド可能であるという方針を選んだということです。
引用: ついでにいうとスーパークラスでAbstract修飾かInterface定義ではないメソッドを
サブクラスでOverrideしようとすると「"Override" の使い方が不正です」とエラーになってしまいます。
たしかに仮想関数・オーバーライド周りはAB5からの機能で,発見されていないバグがある可能性はほかより高いと思うのですが,私にはこの現象を引き起こせませんでした。 ほかの例を見せていただけないでしょうか。 [quote]Sub opened(hWnd, pCreateStruct) のように2度以上オーバーライドをした場合、 cWindow クラスのメソッドが呼ばれてしまい、最終的にオーバーライドしたクラスのメソッドが呼ばれません。[/quote]
なお,Virtual/Abstractでもないしインタフェース由来のものでもない関数をOverrideできないというのであればその通りです。逆に言えば,ABではそのような指定のなされた関数だけがオーバーライド可能であるという方針を選んだということです。 [quote]ついでにいうとスーパークラスでAbstract修飾かInterface定義ではないメソッドを サブクラスでOverrideしようとすると「"Override" の使い方が不正です」とエラーになってしまいます。[/quote]
|
|
|
投稿記事 |
Posted: 2008年12月14日(日) 15:45 |
|
|
|
|
|
ググッたりしてAbstractとVirtualの使い方はなんとなく分かりかけてきました。
が、同時にActiveBasic(旧バージョン?)では↑のバグがあるような記述も見かけました。
もしかしてVirtual関数のオーバーライドあたりにバグがあったりしますか?
ググッたりしてAbstractとVirtualの使い方はなんとなく分かりかけてきました。 が、同時にActiveBasic(旧バージョン?)では↑のバグがあるような記述も見かけました。 もしかしてVirtual関数のオーバーライドあたりにバグがあったりしますか?
|
|
|
投稿記事 |
Posted: 2008年12月13日(土) 22:24 |
|
|
|
|
|
クラスを定義する際のVirtual修飾子はどんな効果があるのでしょうか?
サブクラスで実装した(処理を書いた)メソッドをスーパークラスで呼びたいときはAbstract修飾を使いますが・・・
COMインターフェースとかで使うとかは聞きますが、使ったことはありません。
COMインターフェース以外での利用方法などがあればご教授ください。
それとOverrideについても質問です。
(AB5CP3での現象/他のバージョンは未検証)
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: インターフェース的クラス
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
Sub opened(hWnd, pCreateStruct) のように2度以上オーバーライドをした場合、
cWindow クラスのメソッドが呼ばれてしまい、最終的にオーバーライドしたクラスのメソッドが呼ばれません。
ついでにいうとスーパークラスでAbstract修飾かInterface定義ではないメソッドを
サブクラスでOverrideしようとすると「"Override" の使い方が不正です」とエラーになってしまいます。
そういう仕様ならあきらめますが、どうなのでしょうか?
USBメモリに開発環境を入れているので、AB5CP4, CP5は(クラスライブラリの容量から)導入をためらっています。
環境はWinXP_Pro_ver2002SP3+IE6です
クラスを定義する際のVirtual修飾子はどんな効果があるのでしょうか? サブクラスで実装した(処理を書いた)メソッドをスーパークラスで呼びたいときはAbstract修飾を使いますが・・・ COMインターフェースとかで使うとかは聞きますが、使ったことはありません。 COMインターフェース以外での利用方法などがあればご教授ください。
それとOverrideについても質問です。 (AB5CP3での現象/他のバージョンは未検証) [hide][code]インターフェース的クラス 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 [/code] [code]'実装クラス 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 [/code] [code]グローバル領域 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 [/code][/hide] Sub opened(hWnd, pCreateStruct) のように2度以上オーバーライドをした場合、 cWindow クラスのメソッドが呼ばれてしまい、最終的にオーバーライドしたクラスのメソッドが呼ばれません。
ついでにいうとスーパークラスでAbstract修飾かInterface定義ではないメソッドを サブクラスでOverrideしようとすると「"Override" の使い方が不正です」とエラーになってしまいます。
そういう仕様ならあきらめますが、どうなのでしょうか? USBメモリに開発環境を入れているので、AB5CP4, CP5は(クラスライブラリの容量から)導入をためらっています。
環境はWinXP_Pro_ver2002SP3+IE6です
|
|
|
投稿記事 |
Posted: 2008年12月05日(金) 17:59 |
|
|
|
|