2016-11-13 12 views
3

私はSeat(コンサートホール用)と呼ばれるスーパークラスを持っています。ポリモーフィッククラスの場合、保護されたインスタンス変数を使用しても問題ありませんか?

GoldSeat,SilverSeatおよびBronzeSeatは、そのサブクラスである。

私は常にカプセル化を可能にするためにデータprivateを保持するように読んできました。

サブクラスでこれらのインスタンス変数を使用するメソッドを記述する必要がある場合は、それをprotectedにすることは許容されますか?類似したスタックオーバーフローの質問のほとんどは、オブジェクト指向の正しい設計に対処するのではなく、アクセス修飾子とそれぞれの処理効率または技術的な違いの違いに焦点を当てています。私が1つを逃した場合は、事前に謝罪し、喜んでレビューします。

サブクラスでgetterメソッドを使用してインスタンス変数を取得できますが、この場合は奇妙に見えますが、少なくともデータはprivateになります。

+1

はい、問題ありません。 –

答えて

1

これらは保護されていると考えられますか?

はい。 protected修飾子を使用すると、カプセル化の法則が破られるとは思わない。サブクラスだけがインスタンスにアクセスできるようにし、他の人がアクセスする必要があるものとインスタンスにアクセスできる人を制御します。

私はインスタンスに 変数を取得するには、サブクラスでgetterメソッドを使用することができますが、それはいくつかのケースでは、この場合

に奇妙なようで、あなたは他の人がインスタンスにアクセスすることができます前に、いくつかの前処理をしたいです前処理をゲッターに置くことができます。

+0

私が知る必要があったこと。保護された修飾子を使用するかどうかについては、データとインスタンスにアクセスできるユーザーを定義するコードを記述する責任があります。その責任を念頭に置いて、パッケージのクラス全体がそれらにアクセスできることは大丈夫ですか? –

+2

このリンクはそれを説明するのに役立ちます。 http://stackoverflow.com/questions/902922/why-does-the-protected-modifier-in-java-allow-access-to-other-classes-in-same – Gearon

+0

編集* - それはいくつかの良い説明を与えましたなぜprotectedはパッケージへのアクセスを許可するのですか?おかげで –

1

独自のアクセサメソッドを呼び出すのは「奇怪」ではありません。実際には意味があります。あなたのアクセサメソッドに単純なセット/コード以外のコードが含まれている場合は、それらを確実に呼びたいと思っています。 おそらくあなたの嫌悪感を「純粋な」OOに再考するでしょう。 もちろん、カプセル化も維持されます。

+0

OK、確かに考えるべきことがいくつかあります。また、アクセサメソッドはインスタンス変数の値だけを返します。私のサブクラスがインスタンス変数を継承しているので、それは奇妙に思えましたが、スーパークラスのアクセサメソッドが呼び出されました。おそらくそれは奇妙ではありません(私は初心者です)。 –

+1

私はすべてがプライベートであるSmalltalkでOOで始めました。あなたが上で指摘したように、継承はカプセル化に違反するため、OOモデルの中で最も弱い部分であり、しばしば正しく使用されないと主張することができます。たとえば、あなたは異なる座席についてどのような属性を保持していますか?本当の異なる属性(* values *属性ではない)がない場合、それらは本当にサブクラスではありません。継承と構成の良い扱いについては、Peter CoadのJava Designを参照してください。 – Joe

+1

アクセッサメソッドは、インスタンスへの単純なパススルーではないと想定されます。アクセサメソッドは、ルールと検証または変換を適用するセッターで何らかの処理を行い、潜在的に*多くの*異なるゲッターを提供します。例:文字列の場合はgetAsString、文字列の場合はgetAsXML、数値の場合はgetAsFloat、getAsDouble、getAsIntカプセル化に関するコアビットの1つは、インスタンスvarのフォームが隠されていることです。カプセル化されています。つまり、get/setはこれをどのような方法でも公開しません。サブクラス内のインスタンス変数の取得/設定を呼び出すと、保護されます。 – Joe

関連する問題