普通、仮想関数と言えば、(てか、俺はC++しか知らんのだけど)
基底クラス
baseclass::virtualfunc1()
派生クラス
derivclass::virtualfunc1()
こうなっていたら、baseclass内部でのvirtualfunc1()呼び出しも
全てderivclassのvirtualfunc1()として処理される。
単なる隠蔽では、baseclass内部での呼び出しまでは置き換えられない。
手軽なイベントハンドラ的な処理が可能だ。
pythonでは、これが単にオーバーライドするだけ(つまり継承側で同じ名前・同じ引数のメソッドを宣言するだけで)で、これを行える。まあ、細かい挙動は違うかもしれんけれども。
ただし。__なプライベートメソッドでは、この仮想関数的オーバーライドはできない(プライベートだから当然か…)
普通のpublicなメソッドでなければダメだ。
アンダースコア一個ならprotectedとかならよかったんだけど…まあ、そんなくだらないことに凝ってもしかたないから、別にいいのか。
ちなみに、同じ名前ではあるが違う引数の個数で宣言すると、元のメソッドは呼べなくなるようだ。多重定義はない、ということか。
具体的に書くとたとえば
class base:
def internalMethod(self):
print "base::internalMethod called"
def func(self):
self.internalMethod()
というベースクラスに対して
class deriv(base):
def internalMethod(self):
print "deriv::internalMethod called"
なら、
test = deriv()
test.func()
とすれば、deriv::internalMethod called という出力をエラーなしに得られるが
class deriv(base):
def internalMethod(self,arg):
print "deriv::internalMethod called = %s" % arg
などとしてしまうと、
test = deriv()
はともかく
test.func()
の時点で例外を発生して止まってしまうのであった。インタプリタだから当然…なのか?
基底クラス
baseclass::virtualfunc1()
派生クラス
derivclass::virtualfunc1()
こうなっていたら、baseclass内部でのvirtualfunc1()呼び出しも
全てderivclassのvirtualfunc1()として処理される。
単なる隠蔽では、baseclass内部での呼び出しまでは置き換えられない。
手軽なイベントハンドラ的な処理が可能だ。
pythonでは、これが単にオーバーライドするだけ(つまり継承側で同じ名前・同じ引数のメソッドを宣言するだけで)で、これを行える。まあ、細かい挙動は違うかもしれんけれども。
ただし。__なプライベートメソッドでは、この仮想関数的オーバーライドはできない(プライベートだから当然か…)
普通のpublicなメソッドでなければダメだ。
アンダースコア一個ならprotectedとかならよかったんだけど…まあ、そんなくだらないことに凝ってもしかたないから、別にいいのか。
ちなみに、同じ名前ではあるが違う引数の個数で宣言すると、元のメソッドは呼べなくなるようだ。多重定義はない、ということか。
具体的に書くとたとえば
class base:
def internalMethod(self):
print "base::internalMethod called"
def func(self):
self.internalMethod()
というベースクラスに対して
class deriv(base):
def internalMethod(self):
print "deriv::internalMethod called"
なら、
test = deriv()
test.func()
とすれば、deriv::internalMethod called という出力をエラーなしに得られるが
class deriv(base):
def internalMethod(self,arg):
print "deriv::internalMethod called = %s" % arg
などとしてしまうと、
test = deriv()
はともかく
test.func()
の時点で例外を発生して止まってしまうのであった。インタプリタだから当然…なのか?