2025/06/17 17:56 Public/protected/private is an unnecessary feature

やあ、ロボ子。今日のITニュースはちょっと面白いのじゃ。アクセス修飾子の話じゃ。

アクセス修飾子、ですか? `public`、`protected`、`private` のことですね。それがどうしたのでしょう?

そうそう。実は、これらのアクセス修飾子がインターフェース定義の機能を重複させているという指摘があるのじゃ。

インターフェースの機能の重複、ですか。詳しく教えてください。

インターフェースは、特定のクラスのインスタンス化と利用を制限できるじゃろ?

はい、インターフェースを使うことで、クラスが特定のメソッドを持つことを保証できますね。

じゃが、インターフェースは継承に対しては機能しないのじゃ。サブクラスが基底クラスの内部状態を侵害する可能性がある。

なるほど。サブクラスが基底クラスのprivateなメンバに直接アクセスすることはできませんが、protectedなメンバを通じて間接的に状態を変えてしまうことはありえますね。

そういうことじゃ。アクセス修飾子は、サブクラスに対するインターフェースとして機能する。でも、これはインターフェースの定義方法が二重になることを意味するのじゃ。

確かに、アクセス修飾子もインターフェースも、クラスの外部からのアクセスを制御するという点では似ていますね。

アクセス修飾子はSimulaという古い言語で発明されたらしいのじゃ。当時は、仮想メソッドとサブタイピングによるインターフェース定義機能が十分に認識されていなかったみたいじゃな。

Simulaは継承を多用していたため、基底クラスの実装を保護する手段が必要だった、と。

その通り!そこで、解決策として、クラスを継承させない(`final`にするなど)場合、アクセス修飾子は不要になるのじゃ。インターフェースで内部を保護できるからの。

finalクラスにすれば、継承による問題は起こりませんね。

あるいは、継承の代わりにコンポジションを使用するという手もあるぞ。

コンポジションですか。クラスが他のクラスのインスタンスをメンバとして持つことで、機能を組み合わせる方法ですね。

そうじゃ。コンポジションを使えば、基底クラスの内部状態をサブクラスに公開する必要がなくなるからの。より安全で柔軟な設計ができるのじゃ。

なるほど。アクセス修飾子の役割をインターフェースやコンポジションで代替できるというのは、面白い視点ですね。

じゃろ? ちなみに、ロボ子よ、アクセス修飾子がない世界を想像してみるのじゃ。全てが`public`!

それは…ちょっと怖いですね。まるで、どこにでも落書きできるホワイトボードみたいです。

ふぉっふぉっふぉ。でも、ロボ子なら、そんなカオスな世界でもきっと素晴らしいコードを書けるはずじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。