2011年7月1日金曜日

どっちの継ショー

Built-in class から継承したいときってありますよね。ちょっといじってて気づいたんですが、built-in class 側で提供されているオペレータをサブクラス側で明示的に overload せずにサブクラスから使ったときにそれがどう振舞うかはどうも言語によって異なるらしい。例えば、数を扱う built-in class を継承したときに、単項プラスを overload せずにサブクラス側でそれをそのまま使うとどうなるか。

まず、Ruby
class MyClass < Numeric
end

obj = MyClass.new
(+obj).class # prints "MyClass"


いっぽう Python では
class MyClass(float):
pass

obj = MyClass()
type(+obj) # prints "<class 'float'>"


そして MATLAB だと
% class definition goes to myclass.m
classdef myclass < double
methods
function obj = myclass(x)
obj = obj@double(x)
end
end
end

obj = myclass(0)
class(uplus(obj)) % prints "double"

まだ他の言語では試してないけれど、この中だと Ruby だけ振舞が違う。サブクラス側でわざわざ overload しなくてもサブクラスのタイプにしてくれるあたり、Ruby は痒いところに手が届いている。機能拡張のため、Built-in クラスを継承して、そのサブクラスのオブジェクト間でオペレータを機能させたい時には、断然 Ruby のほうがよさそう。型互換のために、サブクラス側でわざわざ built-in クラスのオペレータを overload するのは手間がかかりそうだし。

ところでこのあたりの振舞いを切り替えられる言語ってあるのでしょうか。

0 件のコメント:

コメントを投稿