- ベストアンサー
ある特定の値(変数)を持たせたい時のクラスの設計法は?
例えば、「人」クラスと、それを拡張した「杉山」、「鈴木」等具体的な名前を与えるクラスを設計する時、「名前」にあたるものはクラスを作った時点で分かるはずです。 また、「人」クラスをスーパークラスとして持つことも共通しています。 こういった場合、名前にあたる変数はどのように実装するべきなのでしょうか? 例えば、 class Person{ } class Suzuki extends Person{ String name = "suzuki"; } のように、するべきなのか class Person{ STring name_; void setName(String name){ name_ = name; } } class Suzuki extends Person{ setName("Suzuki"); } のようにするべきなのか、何がベターなのかよく分かりません。 出来れば、Personクラスを拡張したクラスには、忘れないようにnameフィールドに値を入れるようにしたいのですが、抽象クラスも何か違うのかなぁ…と(よく分かりませんが)。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
いっそこんなのはどお? enum Person { Sugiyama,Suzuki } これを Person.Suzuki.toString() とすれば Suzikiを得られるわよ。 日本語もOK enum Person { Sugiyama,Suzuki,岡田,山本 }
その他の回答 (5)
- e00083
- ベストアンサー率31% (25/80)
>抽象クラスも何か違うのかなぁ…と(よく分かりませんが)。 使用の目的や持たせたい情報量でインターフェースを使うか、抽象クラスを使うか変わってきます。 ただ、abstractを使えないので、ただのクラスから継承するのは、個人的に理解できません。 ベターを追及するなら、クラス設計のデザインパターンの勉強をお勧めします。
- osu_neko09
- ベストアンサー率48% (56/115)
クラス名を取得してしまえば済む話、じゃないんでしょうか? --------classtest.lava------- import java.lang.Class; public class classtest { public static void main(String[] args) { Person myPerson = new Person(); Suzuki mySuzuki = new Suzuki(); String name; Class cls; cls = myPerson.getClass(); name = "myPerson"+ "\n" + " getCanonicalName=" + cls.getCanonicalName() + "\n" + " getName=" + cls.getName() + "\n" + " getSimpleName=" + cls.getSimpleName() + "\n" ; System.out.println( name ); name = "mySuzuki"+ "\n" + " getCanonicalName=" + mySuzuki.getClass().getCanonicalName() + "\n" + " getName=" + mySuzuki.getClass().getName() + "\n" + " getSimpleName=" + mySuzuki.getClass().getSimpleName(); System.out.println( name ); } } --------Person.java------------ public class Person{ Person(){ } } ------Suzuki.java----------- class Suzuki extends Person{ Suzuki(){ } } --------実行結果-------- C:\java>java -classpath c:\java classtest myPerson getCanonicalName=Person getName=Person getSimpleName=Person mySuzuki getCanonicalName=Suzuki getName=Suzuki getSimpleName=Suzuki C:\java>
- foggi47
- ベストアンサー率87% (7/8)
Personのコンストラクタを引数ありにしたらどうでしょう 場合によってprotectedにすればいいかと class Person{ private String name; protected Person(String name){ this.name=name; } } class Suzuki extends Person{ public Suzuki(){ super("Suzuki"); } } ケータイから打ってるので間違いあるかもしれませんがイメージは伝わると思います
- salsberry
- ベストアンサー率69% (495/711)
上記の例ではnameフィールドはインスタンスフィールドのように見えますが、それで合っていますか? たとえばSuzukiクラスのインスタンスを作ったときに、 s1 = new Suzuki(); s2 = new Suzuki(); s1とs2では異なる名前を持たせられるようにしたいのでしょうか。それともSuzukiクラスの全てのインスタンスは同じ名前を共有する前提でしょうか。
- koko_u_u
- ベストアンサー率18% (216/1139)
>Personクラスを拡張したクラスには、 >忘れないようにnameフィールドに値を入れるようにしたいのですが そのようなフィールドが必要だとは思われません。 クラス名が欲しければリフレクションを使えばよいのではないですか?
お礼
回答ありがとうございます。 同じ名前を共有します。