↑したい場合はどうしたらいいでしょうか。
データ構造体(beans)なのでスーパークラスのgetterとsetterを
利用してサブクラスに再構築する方法が考えられますが
どうも腑に落ちないので質問してみました。
サブクラス側で継承をやめて集約にするにしても
getterとsetterをまた書くの?って感じでわずらわしいです。
(jsp:getPropertyを利用するかもしれませんしね)
さらにスーパークラスのメソッド全てをインタフェース化してサブクラスで実装とかしてたら具合が悪くなってきます。
この長年の疑問に終止符を打ってくれる方はいませんか?
No.3ベストアンサー
- 回答日時:
これ以上に的確な回答が存在するかもしれませんし、そもそも意図する回答ではないかもしれませんが。
。。汗スーパークラスの記述変更は可能なのですよね?
でしたら、子クラス(継承クラス)を通して、「親クラスで定義されているフィールド」を引数で渡される親クラスと同型(インスタンス自体は別の)のフィールド値に変更すれば何とかなりそうです。
どういった形で実装するかは自由なのですが、ソースコードを拝見した限りコンストラクタで操作をしたいようなので、今回はコンストラクタで値の変更をしてみます。。
import java.lang.reflect. * ;
class Box {
private String name;
public Box() {}
public Box(Box box) {
try {
Class c=box.getClass();
Field[] f=c.getDeclaredFields();
for(int i=0; i<f.length; i++){
f[i].set(this,f[i].get(box));
}
}
catch(IllegalAccessException e){}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
他のクラス(ColorBox,Main)は提示された物そのままで動くと思います。
もし見当はズレな回答でしたらゴメンナサイ。
「こんなことせんでも・・・」という方が居られましたら補足・訂正・助言を下さい。私の勉強にもなりますので。
斬新な発想ですね。とても参考になります。Field#get
がprivateも参照できるとは・・・盲点でした。
public staticなメソッドとしてユーティリティのよう
な形で実装すると良いように感じました。また、多重継
承にも対応させるためClass#getSuperclassで再起呼び
出しすればスーパークラスをいじる必要もなくなります
しまさに理想的といえます。
Stringクラスだけならいいですがシャローコピーか
ディープコピーを取るかは意見の分かれる所でしょうか。
staticなフィールドや循環参照、インナークラスが
不安要素であり不確定要素に感じました。この辺はも
ちっと勉強します。
もしかしたらデザインパターンとか駆使して簡単にでき
ちゃったりするのかもしれませんが言語仕様の不足をテ
クニックでカバーしているみたいで個人的にとても好き
です。
本当にありがとうございました。
No.2
- 回答日時:
class AClass{...}
class BClass extends AClass{...}
...
AClass x = new AClass();
のとき、
BClass y;
y = (BClass)x;
にしたいということでしょうか?
とすると、不可能です。
これが
AClass x = new BClass();
BClass y = (BClass)x;
なら可能ですが、
最初にAClassとして作った場合はできません。
やると例外が出ます。
No.1
- 回答日時:
ちょっと質問の意味が解かりません。
できれば、もう少し具体的に補足願えないでしょうか。
この回答への補足
言葉で説明するのは難しいものですね。
class Box {
private String name;
public Box() {}
public Box(Box box) {
this=box;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class ColorBox extends Box {
private String color;
public ColorBox(Box box) {
super(box);
}
}
public class Main {
public static void main( String[] args ) {
Box a = new Box();
a.setName("a box");
ColorBox b = new ColorBox(a);
System.out.println(b.getName());
}
}
これはうまくいかないけどthis=boxというところで感じをつかんでいただけたらと思います。本来ならthis.setName(box.getName());
としなければならないでしょう。しかし、フィールドが増えるにつれて
面倒さが飛躍的に増大します。この点が何とかならないか思案している次第です。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java インスタンス ダウンキャストについて以下の解釈であっているか教えて欲しいです。 サブクラスをスーパー 1 2022/03/27 18:53
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- 工学 コンデンサのサブクラスX1、X2について 1 2022/11/13 12:36
- Java htmlのinput type="date"をgetter setterはString型なのですか 1 2022/04/02 04:03
- 知的財産権 ピクサベイの著作権フリー写真の規約について。このような写真の使い方はOKでしょうか? 2 2022/10/28 11:02
- クレジットカード 不正利用 ナイキジャパン 6 2022/08/22 17:35
- 大学受験 娘の大学受験勉強 6 2022/06/30 19:58
- メルカリ メルカリの支払いについて。 1 2022/10/04 15:13
- 医療・安全 Tカード会社、4千万人分の顧客データを販売へ…「同意」は有効か 5 2022/09/03 16:48
- 英語 moreの品詞と用法について 6 2022/10/20 04:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#にて別クラスの関数を使いたい
-
クラス間でのデータ参照
-
関数内の変数に<summary>コメン...
-
import と extends について
-
c++,ある関数のクラスから別の...
-
アップキャスト、ダウンキャス...
-
範囲外の数値を代入したらエラ...
-
C#でほかのファイルにある自作...
-
(クラス名.this.メソッド)って...
-
親クラスから子クラスへアクセス。
-
内部クラスのインスタンスを外...
-
ASP Pageの孫継承のPage_Load
-
C#のクラスライブラリでメッセ...
-
a href="..." とServlet
-
構造 他のクラスの構造体を別...
-
ネストしたenumへのリフレクシ...
-
java-別クラスの変数の使い方を...
-
C# インターフェイスの実装
-
C++でfriendクラスにしているの...
-
Java
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#にて別クラスの関数を使いたい
-
c++,ある関数のクラスから別の...
-
親クラスから子クラスへアクセス。
-
C#でほかのファイルにある自作...
-
クラス間でのデータ参照
-
構造 他のクラスの構造体を別...
-
範囲外の数値を代入したらエラ...
-
ひとつのファイルにクラスは1つ?
-
C++でfriendクラスにしているの...
-
Java リフレクションについて
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
java-別クラスの変数の使い方を...
-
C#のクラスライブラリでメッセ...
-
visual studioのデザイナ画面で...
-
C# log4netの使い方
-
a href="..." とServlet
-
アップキャスト、ダウンキャス...
-
オブジェクトのデータをもとにX...
おすすめ情報