###前提・実現したいこと
Javaで抽象クラスの変数を格納した新たなインスタンスをコピーして返却する方法を模索しています。
イメージは以下のような形です。
abstract class TestClass {
protected String str;
protected int num;
public Object copy { TestClass testClass = null; ... ... return testClass; }
}
抽象クラスはインスタンスを作れないですが、
何か値を渡す手段はないでしょうか。
###発生している問題・エラーメッセージ
エラーメッセージ
###該当のソースコード
ここにご自身が実行したソースコードを書いてください
###試したこと
課題に対してアプローチしたことを記載してください
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
抽象クラスの変数を格納した新たなインスタンス
とおっしゃってますが、提示しておられるコードと一致しないように思えましたので、単にこの抽象クラスのインスタンスのコピーを返すと解釈しますと・・・
TestClassを「コピーができるもの」にしたいならCloneable
を実装したクラスとして定義し、派生クラスにもそれに従わせるのが自然な解決法に思えます。
java
1abstract class TestClass implements Cloneable { 2 protected String str; 3 protected int num; 4 5 @Override public Object clone() { 6 TestClass testClass = (TestClass)super.clone(); 7 ... 8 return testClass; 9 } 10}
Cloneableを実装せずに特殊な目的でコピーさせることをお望みなのでしょうか?もしそうなら、その目的とは何でしょう?それに応じて考えるべきことが違ってくると思います。
投稿2016/10/26 12:06
総合スコア18392
0
無名クラス(anonymous class)をつくればいいのですが、copy()を呼ぶためには抽象クラスTestClassのインスタンスが必要になります。
Java
1abstract class TestClass { 2 protected String str; 3 protected int num; 4 public Object copy() { 5 TestClass testClass = new TestClass() {}; 6 testClass.str = this.str; 7 testClass.num = this.num; 8 return testClass; 9 } 10}
copy()はObjectを返すので、インスタンス変数は隠されてしまいます。Mementoパターンでも実装したいのでしょうか。
TestClassのインスタンスを作らなければ何もできないので、インスタンスを作ります。やはり無名クラスをstaticメソッドで作る。
Java
1public static TestClass getInstance(String str, int num) { 2 TestClass instance = new TestClass() {}; 3 instance.str = str; 4 instance.num = num; 5 return instance; 6}
###DRY (Do not Repeat Yourself) 追記
DRY、同じことを繰り返すなという原則。コードを削ります。
Java
1abstract class TestClass { 2 protected String str; 3 protected int num; 4 public Object copy() { 5 return getInstance(this.str, this.num); 6 } 7 public static TestClass getInstance(String str, int num) { 8 TestClass instance = new TestClass() {}; 9 instance.str = str; 10 instance.num = num; 11 return instance; 12 } 13}
###でもね、抽象クラスが必要ですか?
インスタンスをつくらせたくなければ、コンストラクタをprivateにする方法もあります。自分しかインスタンスを作れない。
Java
1public final class TestClass2 { 2 protected String str; 3 protected int num; 4 private TestClass2 () {} 5 public Object copy() { 6 return getInstance(this.str, this.num); 7 } 8 public static TestClass2 getInstance(String str, int num) { 9 TestClass2 instance = new TestClass2(); 10 instance.str = str; 11 instance.num = num; 12 return instance; 13 } 14}
投稿2016/10/26 10:53
編集2016/10/26 13:44退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/10/26 12:46
2016/10/26 13:02
0
抽象クラスはインスタンスを作れません。
抽象クラスを継承したクラスは、インスタンスを作れます。
抽象クラスを継承したクラスは、抽象クラスのインスタンスとして振る舞うことが出来ます。
したがって、抽象クラスを継承したクラスのインスタンスをreturnで渡せば、受取先は抽象クラスのインスタンスを受け取ったと同じ処理が出来ます。
トリッキーに見えるかもしれませんが、これが多態(ポリモーフィズム)の一般的なやり方の一つです。
投稿2016/10/26 10:01
総合スコア2883
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/26 12:40
2016/10/26 14:37
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/26 12:56
2016/10/26 14:55
2016/10/26 23:38 編集