Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

継承について、

先日は、皆さんに教えて頂き自身考えていた構成よりも良い骨格が出来てきました。本当に有難う御座いました。

今回も初級以下な質問になりますがお願いします。
実際の内容は違いますが簡単な記載に変えますと、
----------
public class SuperMyClass {
    protected int    user_id;
    protected String user_name;
    
    public void setUserData(int id, String name) {
        user_id = id;
        user_name = name;
    }
}
----------
public class SubMyClass extends SuperMyClass {

    public String getUserName() {
        return user_name;
    }
}
----------
public class MainMyClass {
    
    public static void main(String[] args) {
        
        SuperMyClass sc = new SubMyClass();
        sc.setUserData(1, "yamada")
        System.out.println(sc.getUserName());
    }
}
やはり、sc.getUserName()で取得できません・・・よね
この様なスーパークラスのインスタンスからサブクラスのメソッドを操作する考えは間違っているのでしょうか?
構成にもよりますがinserfaceを使うのが一般的でしょうか?

どうぞ宜しくお願いします。

15

回答

78808

閲覧

15件の回答

評価

0

>スーパークラスのインスタンスからサブクラスのメソッドを操作

getUserName()をスーパークラスに実装すればいいじゃん。
つか、子クラスのメソッド(所持金)を呼びに(たかりに)行く必要がある親クラスなんて、親失格ですよ。

逆に、そのメソッドが、どうしても子クラスに必要ですか?
「んなもん、親に持たせておけばよい(必要に応じて脛齧り)」
ってなものなら、最初からそうすればいいんです。

親が子に依存するなんて間違ってるし、
それなら、最初から継承などせず、独立してればいいのです。
子が親の脛を囓る必要がないなら、
そもそも、そんな親子関係必要ないんですよ。

>構成にもよりますがinserfaceを使うのが一般的でしょうか?

Interfaceに記述できるのは宣言だけです。
実装はどのみち必要だし、
それを子クラスでやってたら同じことですよ?
まあ、子クラスでどうのこうのやる前に、
親クラスで実装するなりなんなりしないと、進めなくなりますが。

継承関係ってのは重要ですが、それだけに奥が深いですからね。
ボチボチ理解していってください。

評価

0

>この様なスーパークラスのインスタンスからサブクラスのメソッドを操作する考えは間違っているのでしょうか?
スーパークラスで宣言するのは、そこを使う処理が基本的にスーパークラスに対してのものであるから。
サブクラスに対しての処理を行いたいという明確な指針があるのに、なぜスーパークラスで宣言するのか。

評価

0

もう一つ追加ね。
継承ってのは、コーディングの省力化のためのものではありません。

評価

0

お休みの中、ご指導有難う御座います。

ご指摘の通り、この内容ではサブクラスで処理する必要はありませんが、本来のコードはスーパークラスのオーバーライドやと新たに振る舞いを追加コードを書きたく思い、このサブクラスを作成しました。参照変数を配列化させ処理を振り分けたりしたいのですが、参照変数とオブジェクトがヒープのアドレスの考えで良いのでしょうか?基本的な考えもまだまだです・・・

皆さんのご指摘の内容を察するとサブクラスで新たに振る舞いの追加は無理そうですね?・・・・

評価

0

>スーパークラスのオーバーライドやと新たに振る舞いを追加コードを書きたく思い

それらの処置は、あくまで、新しくサブクラスを定義するためのものです。
親クラスには、何ら影響を及ぼしません。

だいたい、子クラスが複数あったら、どうするつもりです?

というわけで、

>皆さんのご指摘の内容を察するとサブクラス【から親クラスに対して】新たに振る舞いの追加は無理そうですね?・・・・

「サブクラスに対して」なら、いくらでもどうぞ。
(括弧内は不良社員が追加)

評価

0

こう書くべきか。

だいたい、【もしそんなことができたとして、】
子クラスが複数あっ 【て、
親に対して矛盾する操作を行ったら、】 どうするつもりです?

評価

0

そうですよね・・・

サブクラスに初期値や振る舞いを追加するのが基本ですよね・・考えていたのは、

switch(i) {
case 1 : sc =    new SubMyClass1();
                break;
case 2 : sc =    new SubMyClass2();
                break;
case 3 : sc =    new SubMyClass3();
                break;
}
String user_name = sc.getData();

先ほどの、getUserName()をgetData()に変えました。

かなり変な方法でしょうか?


評価

0

getDataなりgetUserNameなり名前なんてどちらでもいいですが、
共通のシグニチャなら、そのメソッドは親クラスで定義しましょう。
デフォルト実装が無理なら、abstractにしちゃえばいいんです。

で、
SuperClass sc = new SubClass();
sc.getData()+
ってかんじで、
扱うときは親クラスの型で扱えばOKです。

評価

0

+は;のタイポです。

評価

0

「車」というクラスがすでにあって、
名前を始め諸元の変数も用意があるのに、
わざわざ「カローラ」とか「レクサス」の
クラスを作ろう、なんて考えてるのかね。

んなの、わざわざサブクラスなんか必要ないじゃん。
もしかして、コンストラクタを知らないのか?

勘違いだったら失礼。

String name = null;
switch(i) {
case 1 : name = "name1";
                break;
case 2 : name = "name2";
                break;
case 3 : name = "name3";
                break;
}
SuperClass sc = new SuperClass(name);
String user_name = sc.getName();

評価

0

私も最初は親クラスでsbstract指定して子供クラスの方で実装を書いていたのですが、子で新たにメソッドを追加し、この様な処理をもう一度したかったので親の方を手を加えない処理に悩んでいました。

プログラム未経験なので組み立て方法、デザインパターンを勉強しなければいけませんね。

正直、私の考えは間違っていますか?

評価

0

はっきりと書かないとわかりませんか。
つか、徒労感を誘われるレスですね・・・。

書くべきことは書いたので、退散します。

評価

0

あるメソッドがスーパークラス向けにできているのに、サブクラスを作ってメソッドにそのサブクラス向けの処理を追加したいというなら、それはメソッドの設計が破綻しているということ。
ふつういったん定義したメソッドで、そういうことは発生しない。

場合によってはinstanceOf等で調べて、処理を分けた上でキャストしてメソッドを呼び出したりもするが、良い構造ではない。

また、スーパークラスの設計が間違っているのが分かったのなら、修正を恐れるべきではない。


デザインパターンはクラス設計の基本とは違う話。

評価

0

皆様、ご指摘ありがとうございました。
今後の修正を考えて作成していましたが全く今までの考えを変えて勉強したいと思います。継承と言う意味をシンプルに変えて作り直していきます。

勉強になりました!

評価

0

>今後の修正を考えて作成していましたが

ここは笑うところなのか。

親クラスにしかるべき実装を施すのは、
根本を太く作ると言うこと。
子クラスをいじくって済ますのは、
枝葉を際限なく太らせるだけ。

時間が経ってから、後で収拾つかなくなるのは
どっちだと思う?

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。