はじめに
いろんな言語をまたがって開発しているときに混乱するポイントとして、アクセス修飾子があります。
今回はスマホアプリ開発編として、Android開発で用いられるJava/Kotlin、iOS開発で用いられるObjective-C/Swift、そしてXamarinで使われるC#/F#について、それぞれのアクセス修飾子について調べて、比較表としてまとめてみました。
※Java/C#以外はほとんど経験がないので、間違いがありましたらご指摘いただけますと幸いです
比較表
アクセス修飾子 | Java | Kotlin | Objective-C | Swift | C# | F# |
---|---|---|---|---|---|---|
open | (存在しない) | (存在しない) | (存在しない) | どこからでもアクセス可能 ※Swift3で追加 |
(存在しない) | (存在しない) |
public | どこからでもアクセス可能 | どこからでもアクセス可能 | どこからでもアクセス可能 | どこからでもアクセス可能 ※ただし別モジュールからの継承とオーバーライドは不可(Swift2まではどこからでもアクセス可能) |
どこからでもアクセスが可能 | どこからでもアクセスが可能 |
package | (存在しない) | (存在しない) | 同一フレームワーク内からアクセス可能 ※フレームワーク外ではprivate |
(存在しない) | (存在しない) | (存在しない) |
protected | 同一パッケージ内のクラス+派生クラスからアクセス可能 | 継承した同一パッケージ内のクラス+派生クラスからアクセス可能 | 同一クラス+派生クラスからアクセス可能 | (存在しない) | 同一クラス+派生クラスからアクセスが可能 | (存在しない) |
protected internal | (存在しない) | (存在しない) | (存在しない) | (存在しない) | 同一プロジェクト内のクラス+派生クラスからアクセス可能 | (存在しない) |
internal | (存在しない) | 同一モジュール内でアクセス可能 | (存在しない) | 同一モジュール内でアクセス可能 | 同一アセンブリ内でアクセス可能 | 同一アセンブリ内でアクセス可能 |
fileprivate | (存在しない) | (存在しない) | (存在しない) | 同一ファイル内でアクセス可能 ※Swift3で追加 |
(存在しない) | (存在しない) |
private | 同一スコープ内でアクセス可能 ※内部クラスのprivate変数も参照可 |
同一スコープ内でアクセス可能 | 同一スコープ内でアクセス可能 | 同一スコープ内でアクセス可能 ※Swift2までは同一ファイル内でアクセス可能 |
同一スコープ内でアクセス可能 | 同一スコープ内でアクセス可能 |
指定しない | 同一パッケージ内でアクセス可能 | publicと同じ | protectedと同じ | internalと同じ | privateと同じ | publicと同じ ※let束縛/do束縛ではprivateと同じ |
何も指定しなかったときの動きがそれぞれ見事に異なるので、注意が必要そうです。
参考
はじめてのKotlin。Javaと比較してみた
Swift 3からのアクセスコントロール
Objective-C アクセス指定子