ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Scalaコミュのa()とaが同じ理由: Scalaの名前空間と一様アクセス原則

  • mixiチェック
  • このエントリーをはてなブックマークに追加
ちりとてちん。

Scalaの文法を勉強していると、その美しさというか設計思想に
なるほど、と思うことがあります。

なんとScalaの名前空間は2つしかありません。
みなさんご存知のようにJavaの場合は4つ:
  fields, methods, types, packages
で分かれています。
一方Scalaはというと2つ:
 . values (fields, methods, packagesは共通)
 . types (class/trait)
つまり、インスタンス変数、メソッド、パッケージはすべて同じネームスペースです。

なんでこんなになっているかというと、
あのEiffelで名高いBertrand Meyerの主張である
アクセッサa()はその実装を隠すべきである。
a()の実現は、インスタンス変数の保持によるのか、計算で求めるのか
の違いは、a()を呼び出すクライアントにはどうでもよいことである!という原則の実現です!

Javaでは、たとえ引数がなくともメソッドの呼び出しは必ず
a()と書く必要があり、aと省略することはできません。

それが、Scalaでは、
a()はaと引数括弧を省略して書けますので、それがメソッド呼び出しなのか
インスタンス変数参照なのかを隠すことができるわけです。

さらに、すばらしいのは、スーパークラスAでアクセッサaを宣言したおいたのを
そのサブクラスSubAにおいてメソッドa()としてoverrideすることができます。
これは、fields, methodsともに同じネームスペースであるおかげです。

class T
abstract class A { def a():T }          //aが具体的でないのでabstractを付けない
abstract class SubA extends A { val a:T }  //とコンパイラに怒られる

このことは、逆に、同じクラス内において
インスタンス変数bとメソッドb()を同時に定義することはできない
ということを意味します。

コメント(0)

mixiユーザー
ログインしてコメントしよう!

Scala 更新情報

Scalaのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング