私の質問は Java に関するものですが、C# にも適用できます。インスタンス変数をprotectedにするのではなく、privateにすることを誰もが推奨するのはなぜだろうと思っていました。
考えてみましょう。プライベート変数はサブクラスには表示されないため、サブクラスのスーパークラスの変数にアクセスまたは変更する必要がある場合は、getMyPrivateVariable
またはのようなアクセサーおよびミューテーター メソッドを使用する必要があります。setMyPrivateVariable
. ただし、一部のクラスを拡張してそのメンバーを継承すると、サブクラスでそれらを直接宣言したかのように機能します。したがって、論理的には、サブクラスもインスタンス変数に直接アクセスできる必要があり、保護された変数を使用してクラスを設計する必要があることを意味します。このような慣行はカプセル化を破ることを理解していますが、これは継承の場合は無関係に思えます。なぜなら、この場合も、スーパークラスのメンバーがサブクラスで宣言されているかのようにすべてが機能するため、サブクラスには「自然な権利」があるからです。継承されているかどうかに関係なく、そのメンバーに直接アクセスできるためです。私の意見では、カプセル化は、オブジェクトの継承ツリーの外部にある他のオブジェクトによってオブジェクトとやり取りするために重要です。
それで、私の質問は、クラスのインスタンス変数を保護ではなくプライベートとして宣言することを誰もが推奨するのはなぜですか?