Java : Mixin(多重継承)とかパーシャルクラスとか
JavaにはMixinやパーシャルクラスがないので、それっぽいことをしたいときには委譲コードをたくさん書かなければいけないから(´Д`)マンドクサ とか、言語上の欠陥だ!という勢いで批判する*1という人がいるけれど、それはJavaという言語を使いこなせていないだけなんじゃね?と思う。
ということで、JavaでMixinのようなことがしたいときにはどうするかということを、さらっと書いてみたい。
-
-
- -
-
まず、toString()で受け取った文字列を反転するmixinクラスを次のように作る。
abstract class StringMixin { abstract String toString(); String reverse() { String str = toString(); StringBuffer ret = new StringBuffer(); for (int i=str.length()-1; i>=0; --i){ ret.append(str.charAt(i)); } return str.toString(); } }
次に、猫クラスを作って、その名前に対する加工処理をmixinしてみる。
class Cat { String name; Cat(String name) { this.name = name;} //Mix-in final StringMixin name_ad = new StringMixin() { String toString() { return name;}}; }
また、雑誌クラスに対してもmixinしてみる。
class Magazine { String title; Magazine(String title) { this.title = title;} //Mix-in final StringMixin title_ad = new StringMixin() { String toString() { return name;}}; }
使い方は(省略)。
おわり。
-
-
- -
-
ちなみに、聡い読者の方ならお気づきと思いますが、final属性を外せば、動的にmixinを切り替えることができます。
また、同じMixinを対象とするフィールドを切り替えて、複数持たせることもできます。(下のように)
class Book { String author; String title; Book(String author, String title) { this.author = author; this.title = title; } //Mix-in final StringMixin author_ad = new StringMixin() { String toString() { return author;}} final StringMixin title_ad = new StringMixin() { String toString() { return author;}} }