可触性について

以前可触性はC++と同じ、ということを書きましたが、そう実装できていなかったし、Xtalの仕様的にC++と同じにするのは無理でした。

なので、若干意味を変えます。

  • publicメンバはアクセス制限なし。
  • privateメンバは、レキシカルスコープで見える場所からしか触れなく、外部から呼ぼうとすると定義されてないかのように振舞うメンバ。
  • protectedメンバは、thisがそのクラスかサブクラスのインスタンスでないと触れないメンバ。
Foo: class{

  // privateメンバ
  - private_member: method{}

  # protected_member: method{
    // private_memberはローカル変数として触ることが出来る。
    private_member();

    // 次のように呼ぶことは出来ない。
    // this.private_member();
  }

  public_member: method{

    // このpublic_memberメソッドが呼ばれるとき、
    // thisが、FooかFooのサブクラスならば、次の呼び出しはエラーにならない。
    this.protected_member();
  }
}

foo: Foo();

foo.public_member();

foo.private_member(); // Foo :: 'private_member'は定義されていません、という例外が投げられる

foo.protected_member(); // Foo :: 'protected_member'は 'protected'です、という例外が投げられる

Hoge: class(Foo){
  // Foo::public_memberと同名なメンバを、privateで定義してみる
  - public_member: method{}
}

hoge: Hoge();

hoge.public_member(); // Hoge::public_memberはプライベートなので外部からのアクセスは完全に無視され、Foo::public_memberが呼ばれる

Xtalでは、privateメンバ、インスタンス変数ともに、そのクラスのスコープ内のメソッドからだけ触ることが出来るようになります。
そのため、mixinの際同名のprivateメンバやインスタンス変数の衝突を気にする必要はありません。