ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 02:59

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2008年12月05日(金) 17:59 
クラスを定義する際のVirtual修飾子はどんな効果があるのでしょうか?
サブクラスで実装した(処理を書いた)メソッドをスーパークラスで呼びたいときはAbstract修飾を使いますが・・・
COMインターフェースとかで使うとかは聞きますが、使ったことはありません。
COMインターフェース以外での利用方法などがあればご教授ください。


それとOverrideについても質問です。
(AB5CP3での現象/他のバージョンは未検証) Sub opened(hWnd, pCreateStruct) のように2度以上オーバーライドをした場合、
cWindow クラスのメソッドが呼ばれてしまい、最終的にオーバーライドしたクラスのメソッドが呼ばれません。

ついでにいうとスーパークラスでAbstract修飾かInterface定義ではないメソッドを
サブクラスでOverrideしようとすると「"Override" の使い方が不正です」とエラーになってしまいます。

そういう仕様ならあきらめますが、どうなのでしょうか?
USBメモリに開発環境を入れているので、AB5CP4, CP5は(クラスライブラリの容量から)導入をためらっています。

環境はWinXP_Pro_ver2002SP3+IE6です


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年12月13日(土) 22:24 
ググッたりしてAbstractとVirtualの使い方はなんとなく分かりかけてきました。
が、同時にActiveBasic(旧バージョン?)では↑のバグがあるような記述も見かけました。
もしかしてVirtual関数のオーバーライドあたりにバグがあったりしますか?


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年12月14日(日) 15:45 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
たしかに仮想関数・オーバーライド周りはAB5からの機能で,発見されていないバグがある可能性はほかより高いと思うのですが,私にはこの現象を引き起こせませんでした。
ほかの例を見せていただけないでしょうか。
引用:
Sub opened(hWnd, pCreateStruct) のように2度以上オーバーライドをした場合、
cWindow クラスのメソッドが呼ばれてしまい、最終的にオーバーライドしたクラスのメソッドが呼ばれません。
なお,Virtual/Abstractでもないしインタフェース由来のものでもない関数をOverrideできないというのであればその通りです。逆に言えば,ABではそのような指定のなされた関数だけがオーバーライド可能であるという方針を選んだということです。
引用:
ついでにいうとスーパークラスでAbstract修飾かInterface定義ではないメソッドを
サブクラスでOverrideしようとすると「"Override" の使い方が不正です」とエラーになってしまいます。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2008年12月20日(土) 22:27 
引用:
たしかに仮想関数・オーバーライド周りはAB5からの機能で,発見されていないバグがある可能性はほかより高いと思うのですが,私にはこの現象を引き起こせませんでした。
ほかの例を見せていただけないでしょうか。
ためしに次のようなコードを書いたのですが、きちんとオーバーライドされました。 う~ん。適当にクラスを作ってやってみるとちゃんと動作するorz

ためしに最新のバージョンをDLして問題のコードを実行したところ正常にオーバーライドできてました><
バージョンアップの際にバグフィックスされたのかもしれません。
最新のは解凍した状態で60メガほどの容量だったので、あまりUSBメモリに入れたくないのですが・・・

引用:
なお,Virtual/Abstractでもないしインタフェース由来のものでもない関数をOverrideできないというのであればその通りです。逆に言えば,ABではそのような指定のなされた関数だけがオーバーライド可能であるという方針を選んだということです。
Abstractなメソッド
 ・処理内容を継承先に丸投げ
 ・直接のオーバーライド先でのみオーバーライド可能?

Virtualなメソッド
 ・処理内容を変更するサブクラスがある場合にVirtualをつける
 ・サブクラスAでオーバーライドしたとしても、そのサブクラス(サブクラスAのサブクラス)でさらにオーバーライド可能

といった感じであっているでしょうか?


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年12月28日(日) 00:37 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
AbstractとVirtualはそのような感じです。
ただし,ソースコードの外見上AbstractとVirtualでは,そこに関数の実装をかけるかということと,Abstractメンバを実装していないクラスはNew(実体作成)ができないという点が大きく異なります。
逆に,どこでオーバーライドできるかという点においては同じはずです。挙動が違ったらおそらくバグですので是非ご報告ください。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[16人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean