オブジェクト指向の能力強化を図るため、
ネットで調べた下記の原則にしたがって、クラスの設計を考えています。
・getter/setterは利用しない。
・フィールドは必ずprivateにする。
この時、継承を使った下記のようなコードについて考えてみました。
このサブクラスの中で、どうやってもnameに辿りつけません。
java
1public class Main { 2 public static void main(String[] args) { 3 Man man = new Man("hoge"); 4 man.Answer(); 5 } 6} 7 8abstract class Person { 9 private String name; //Personは誰しもnameを持つ 10 public Person(String name){ 11 this.name = name; 12 } 13 14 abstract String Answer(); //答え方は人それぞれ 15 16} 17 18class Woman extends Person { 19 Woman(String name){ 20 super(name); 21 } 22 public String Answer(){ 23 return name + "と呼んでちょうだい" //エラー 24 } 25} 26 27class Man extends Person { 28 Man(String name){ 29 super(name); 30 } 31 public String Answer(){ 32 return name + "と呼んでくれ" //エラー 33 } 34}
解決方法として、下記を考えましたが、どうしても納得のいくものが思い浮かびません。
何か良い方法は無いでしょうか。
1.Personにnameは持たせず、サブクラスで個別に持たせる。Answerメソッドはインターフェースに変更する。
⇒nameは誰しも持つという思想に反する。nameに関する処理、その他フィールドの追加等、一元管理ができなくなる。
2.getterを作る。
⇒原則に反する。
3.nameフィールドをprotectedにする。
⇒原則に反する。
4.そもそも、フィールドだけを保持させるPersonクラスが設計としておかしいので、処理させるメソッドを持たせて何とかする。
⇒結局getterになってしまいそうで、やり方がわからない。
継承を覚えたての初心者の質問で申し訳ありませんが、ご教示の程、よろしくお願いします。
※Newhalfクラスを持たせる未来が無ければ、Personが不要な気がしてきました。
回答12件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/07/13 13:39