-- / --
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

12 / 04
Wed

正常稼動には最低 7 時間の睡眠が必要な Ziphil です。

Kotlin でプログラミングしていて、 奇妙なことに遭遇したのでまとめてみます。

Kotlin のアクセス修飾子は public, internal, protected, private の 4 つで、 デフォルトは internal です。 Java をやってる人には、 この 「internal」 ってのは初めて聞くものでしょうが、 これは 「モジュール内部でのみ可視」 を意味します。 じゃ、 その 「モジュール」 ってのは何かという話になりますが、 調べてみたんですが、 私もいまいちよく分かってません。

さて、 モジュールはおいておいて、 初め私は、 internal 以外の 3 つは Java にも存在する修飾子だから、 挙動も Java と同じかなーと思ったわけです。 ・・・が、 protected だけ違うみたいです。

open class Foo() {
  protected fun protectedFunction() {
    println("test")
  }
}
class Bar() {
  fun test() {
    Foo().protectedFunction()  // 非継承クラスから呼び出し 
  }
}
class Baz() : Foo() {
  fun test() {
    Foo().protectedFunction()  // 継承クラスから呼び出し
  }
}

Java に慣れている人にとっては、 これは正しいコードの見えるかもしれませんが、 Bar クラスの protectedFunction でコンパイルエラーになります。 どうやら、 Kotlin の protected は 「サブクラスと同ファイル内でのみ可視」 ではなく、 「サブクラスでのみ可視」 のようです。 ちなみに、 残りの private と public は、 それぞれ 「自クラスでのみ可視」 と 「全クラスから可視」 を意味し、 Java と同じです。

Kotlin はメジャーではないので、 情報が少ないのが難点ですね・・・。 日本語の情報はないに等しいです。 ちなみに、 Kotlin のアクセス修飾子については、 私が探した限り、 公式サイトには記載がありませんでした。 JetBrains のフォーラムのスレッド (これ) で見つけたくらいです。

ちなみに、 この事実は、 CharacterData というキャラクターを扱うトレイトを継承して、 PlayerData というプレイヤーを扱うクラスを作ろうとしたときに、 変数を継承しようとして気づきました。 個人的には、 Java の protected よりも Kotlin の protected の方が使い道が広くて好みです。

スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。