列挙型のオーバーロードについて

ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
返信する
メッセージ
作成者
k.kiyo

列挙型のオーバーロードについて

#1 投稿記事 by k.kiyo »

下記のプログラムのように、
列挙型を引数にして関数を呼ぶと、
Long型のfunc関数が呼ばれます。

コード: 全て選択

enum eTEST
    eTEST_AAA = 0
    eTEST_BBB
endenum

sub func(e as eTEST)
    print "func enum"
endsub

sub func(n as long)
    print "func long"
endsub

func(0)         '"func long"
func(eTEST_AAA) '"func long"
この事と関係あるのか分かりませんが、
列挙型をとるメソッドをオーバーライドして、
そのメソッドを呼ぼうとすると
「オーバーロードを解決できません」
というエラーになります。

コード: 全て選択

class CTestBase
public
    sub func(e as eTEST)
        print "CTestBase::func enum"
    endsub
endclass

class CTest
    inherits CTestBase
public
    sub func(e as eTEST)
        print "CTest::func enum"
    endsub
endclass

dim obj as CTest
obj.func(eTEST_AAA)'オーバーロードを解決できません
AB4.20
k2

オーバーロード解決エラーは

#2 投稿記事 by k2 »

私の環境でも、オーバーライドした関数を呼び出す際に
オーバーロード解決エラーが発生しました。
問題の関数の引数はBytePtr型1つです。
環境はWinXP SP2、AB 4.20です。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#3 投稿記事 by イグトランス »

これはこれはまた便利になりました。まずはありがとうございます。

さて使う前にABはオーバーロードの解決の仕様はどうだろうと調べるため唯一の実装に対して色々と試してみるわけです。

ヘルプにコンストラクタのオーバーロードができるとは書いてありませんし,
実際できませんができるようにしてほしいです。

コード: 全て選択

Class hoge
Public
	Sub hoge(n As Long)
		Print "hoge(n) n ="; n
	End Sub

	Sub hoge() '書くだけならエラーにならない
		Print "hoge()"
	End Sub
End Class

Dim obj1 As hoge(3)
’↓2つはエラー
'Dim obj2 As hoge()
'Dim obj3 As hoge
また次のように継承関係がある場合のfのオーバーロードと,
(オーバーロードとは関係がありませんが)基底クラスへの参照を受け取る引数に派生クラスのオブジェクトを渡せないのは問題ありだと思います。
(後者はまだ仮想関数によるポリモーフィズムができないので影響は小さいですけど)

コード: 全て選択

#strict
#prompt

Class Foo
End Class

Class Bar
	Inherits Foo
End Class

Sub f(ByVal pFoo As *Foo)
	Print "f(ByVal pFoo As *Foo)"
End Sub

Sub f(ByVal pBar As *Bar)
	Print "f(ByVal pBar As *Bar)"
End Sub

Sub g(ByRef foo As Foo)
End Sub

Dim bar As Bar

f(VarPtr(bar))
g(bar)
今度は数値型同士のオーバーロードです。

コード: 全て選択

Sub f(ByVal n As Int64)
	Print "f(ByVal n As Long)"
End Sub

Sub f(ByVal n As Double)
	Print "f(ByVal n As Double)"
End Sub

Sub g(ByVal n As Char)
End Sub

Sub g(ByVal n As Long)
End Sub

f(0.5 As Single)
f(65536 As Word)
g(&hffff)
特にfのようなオーバーロードは,たとえばStr$関数をDoubule/Int64/QWordにオーバーロードして
64ビット整数を指数表記しない文字列へ変換するということを考えたときに,
Single型やWord型の変数をキャストなしには渡せないと言う状況になり不便だという状況が思い浮かびます。
返信する