Perl6 の Role の例を Squeak Smalltalk の Traits で
Trait named: #A uses: {} category: 'Category-Name'. Trait named: #B uses: {} category: 'Category-Name'
A compile: 'foo ^#A'. B compile: 'bar ^#B'. Object subclass: #Foo uses: A + B instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Category-Name'
Foo new foo "=> #A "
リネームはないので、B>>#foo の追加定義で。→コンフリクトでエラー。
B compile: 'foo ^#B'. Foo new foo "=> Error: A class or trait does not properly resolve a conflict between multiple traits it uses. "
B>>#foo を #bFoo にエイリアスしてから B>>#foo は除く。
Object subclass: #Foo uses: A + B @ {#bFoo->#foo} - {#foo} instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Category-Name'.
これでコンフリクトは解消され、期待通り動作するように。
Foo new foo "=> #A "
Foo new bFoo "=> #B "
追記:
流れがわかりやすいように、スクリプト言語風に省略した記法で。
(注意:前掲コードと異なり、このまま do it、print it することはできませんが、環境の操作方法を知っている人がクラスブラウザなどを使用して同等のコードを書くのに必要な情報はすべて含まれています)
Trait named: #A A >> foo ^#A Trait named: #B B >> bar ^#B Object subclass: #C uses: A + B C new foo "=> #A" C new bar "=> #B" B >> foo ^#B C new foo "=> error " Object subclass: #C uses: A + B@{#bFoo->#foo}-{#foo} C new foo "=> #A " C new bFoo "=> #B "