質問: name; } abstract String Answer(); //答え方は人それぞれ } class Woman extends Person { Woman(String name){ super(name); } public String Answer(){ return name + "と呼んでちょうだい" //エラー } } class Man extends Person { Man(String name){ super(name); } public String Answer(){ return name + "と呼んでくれ" //エラー } } ``` 解決方法として、下記を考えましたが、どうしても納得のいくものが思い浮かびません。 何か良い方法は無いでしょうか。 --- 1.Personにnameは持たせず、サブクラスで個別に持たせる。Answerメソッドはインターフェースに変更する。 ⇒nameは誰しも持つという思想に反する。nameに関する処理、その他フィールドの追加等、一元管理ができなくなる。 2.getterを作る。 ⇒原則に反する。 3.nameフィールドをprotectedにする。 ⇒原則に反する。 4.そもそも、フィールドだけを保持させるPersonクラスが設計としておかしいので、処理させるメソッドを持たせて何とかする。 ⇒結局getterになってしまいそうで、やり方がわからない。 --- 継承を覚えたての初心者の質問で申し訳ありませんが、ご教示の程、よろしくお願いします。 ※Newhalfクラスを持たせる未来が無ければ、Personが不要な気がしてきました。
回答: ThoughtWorksアンソロジーのオブジェクト指向エクササイズの話でしたら 「フィールドはprivate」ルールは存在しないので protectedにすればいいです。 それに加えてprivate縛りをしたいというなら getterの代わりに、コールバックを引数に取るメソッドを作って、 メソッド内ではそのコールバックにnameを渡します。 そしてこれをgetterではないと言い張れば完成です。