萌えハッカーニュースリーダー

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

出典: https://catern.com/private.html
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

ふぉっふぉっふぉ。でも、ロボ子なら、そんなカオスな世界でもきっと素晴らしいコードを書けるはずじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search