friendメソッド, enemyメソッド

投稿日: Mar 26, 2009 1:34:25 AM

SmallTalk R4.1では、従来のprotected、privateに加え、よりきめ細かなアクセス制御をサポートするfriendメソッド、enemyメソッドの機能を提供しています。

1. friendメソッド

呼び出し元となれる友好オブジェクトの素性を指定します。

MyClass>>friendExample

    self friend: FriendClass.

    ...

上記の例では、friendメソッドの引数にFriendClassクラスを指定することで、friendExampleメソッドの利用者をFriendClassのインスタンスのみに制限しています。

friendの条件に合わないオブジェクトがfriendExampleメソッドを呼び出した際には、直ちにFriendNotFoundエラーが生起されます。

friendメソッドの引数には、呼び出し側のクラス(必須)、およびメソッド(オプション)を指定することができます。

-指定例

self friend: Friend. "Friendクラスのインスタンス"

self friend: #Friend. "同上"

self friend: 'Friend'. "同上"

self friend: 'Fr*'. "クラス名がFrで始まるクラスのインスタンス(*はワイルドカード)"

self friend: #(FriendA FriendB). "FriendAクラスのインスタンス、およびFriendBクラスのインスタンス"

self friend: Friend + #super. ”Friendクラスとそのスーパークラスのインスタンス

                                               (サブクラスを指定する場合は次のいずれかを+メソッドの引数とする。

                                               (#super | #superclasses | #parents | #base))”

self friend: Friend allSubclasses. "同上"

self friend: Friend + #sub. ”Friendクラスとそのサブクラスのインスタンス

                                            (サブクラスを指定する場合は次のいずれかを+メソッドの引数とする。

                                            (#sub | #subclasses | #children | #derived))”

self friend: Friend allSubclasses. "同上"

self friend: Friend + #all. "Friendクラスのインスタンス、およびそのスーパークラス・サブクラスのインスタンス"

self friend: Friend allSuperclasses , Friend allSubclasses. "同上"

self friend: Friend ->> #aaa. "Friendクラスのインスタンスのaaaメソッド"

self friend: Friend ->> #(#aaa #bbb). "Friendクラスのインスタンスのaaaメソッドおよびbbbメソッド"

self friend: Friend ->> '*ccc'. "Friendクラスのインスタンスのメソッド名がcccで終わるメソッド"

self friend: Friend + #sub ->> #(#ddd 'eee*'). "Friendクラスのインスタンス、およびそのサブクラスのインスタンスで、

                                                                          dddメソッド、もしくはメソッド名がeeeで始まるメソッド"

2. enemyメソッド

呼び出し元になれない敵性オブジェクトの素性を指定します。

MyClass>>enemyExample

    self enemy: EnemyClass.

    ...

上記の例では、enemyメソッドの引数にEnemyClassクラスを指定することで、enemyExampleメソッドの利用者をEnemyClass以外のインスタンスのみに制限しています。

enemyの条件に合致するオブジェクトがenemyExampleメソッドを呼び出した際には、直ちにEnemyFoundエラーが生起されます。

enemyメソッドの引数については、friendメソッドの引数を参考にしてください。