先日、Kotiln勉強会というものに行って来ました。まあ、自分の発表は拙作kollectionライブラリの発表という割とどうでもいいものでしたが、それはそうとKotlinエバンジェリストたろーさんがClass Delegationという機能について紹介していました。
要は、
class CountingSet<E>(private val set: MutableSet<E>): MutableSet<E> by set
のようにすると、MutableSetset
に委譲されるという機能です。これ、既視感あるなーと思ってみたら、自分が昔作った言語Onion(2005〜) にそのまんまの機能があったではないかということを思い出しました。
OnionはGenericsがなかったりするので(これは単に手抜き)ちょっと違いますが、同じことが
class CountingSet <: Set { forward @n :Set; public: def new { @n = new HashSet } }
こんなふうに書けます。クラスのヘッダ部分かフィールド部分のどちらに委譲の宣言が現れるかという点で若干の違いがありますが機能的にほぼおなじです。自分も割と先見の明があった(?)のだなあなどと思ったのでした。ちなみに、Onionを作った時期はRubyに大きな影響を受けていたので、メソッド定義がdef
だったりフィールドが@
で始まっていたりとRubyに影響を受けた節があちこちにあります。今再設計するならだいぶ文法は変わるだろうなと思います。
まあ、今はKlassic開発中なので、Onionはあまり手を入れる気はないですが。