質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

3426閲覧

抽象クラスのコピー方法(java)

hs-as

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2016/10/26 09:21

編集2016/10/26 09:35

###前提・実現したいこと
Javaで抽象クラスの変数を格納した新たなインスタンスをコピーして返却する方法を模索しています。
イメージは以下のような形です。

abstract class TestClass {
protected String str;
protected int num;

public Object copy { TestClass testClass = null; ... ... return testClass; }

}

抽象クラスはインスタンスを作れないですが、
何か値を渡す手段はないでしょうか。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

kaputaros👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hs-as

2016/10/26 12:56

特殊な目的でのコピーを望んでいるわけではなく、Cloneableについての理解(勉強)が足りていませんでした。 clone()メソッドについて調べたところ、Object #clone() と、Cloneable インターフェースの関係がなんとなく見えてきました。 こちらについて勉強してみます。ありがとうございます。
swordone

2016/10/26 14:55

Objectを返すならわざわざキャストする意味とは
KSwordOfHaste

2016/10/26 23:38 編集

3点リーダーのところでそのクラスのコピーに必要な何かの処理をすると想定してです。浅いコピー(所謂shallow copy)のみでかまわないならキャストする必要もないですね。
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hs-as

2016/10/26 12:36

newする部分に{}をつけるとコンパイルエラーが起こらなくなりましたが、これはどういった仕組みなのでしょうか。(動作確認はできていないですが、) Javaの入門のテキストは読み、おおよそ理解できていると思いますが、抽象クラスはインスタンス化できないと思っていたので、ご教示いただけるとありがたいです。
退会済みユーザー

退会済みユーザー

2016/10/26 12:46

TestClassのサブクラスの宣言とインスタンスの生成を同時に行います。これを無名内部クラス(匿名クラス)と呼びます。
hs-as

2016/10/26 13:02

ありがとうございます。 まだ全然理解できていませんが、匿名クラスについての解説が色々ありそうなので、そちらも見つつ調べようと思います。
guest

0

抽象クラスはインスタンスを作れません。

抽象クラスを継承したクラスは、インスタンスを作れます。
抽象クラスを継承したクラスは、抽象クラスのインスタンスとして振る舞うことが出来ます。

したがって、抽象クラスを継承したクラスのインスタンスをreturnで渡せば、受取先は抽象クラスのインスタンスを受け取ったと同じ処理が出来ます。

トリッキーに見えるかもしれませんが、これが多態(ポリモーフィズム)の一般的なやり方の一つです。

投稿2016/10/26 10:01

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hs-as

2016/10/26 12:40

copyのメソッドの中で、子クラスのインスタンスを生成して値を格納するということでしょうか? その場合、複数のクラスに継承させる場合は、複数のcopyメソッドを書くことになるのでしょうか?
iwamoto_takaaki

2016/10/26 14:37

いいえ。 Copyメソッドを呼ぶためにはインスタンスが必要です。 当然、そのインスタンスは抽象クラスの子クラスです。 継承をすると親クラスのメソッドが使えるので、親クラスのCopyメソッドは呼び出すことが出来ます。 抽象クラスとして、変数をコピーするなら、Vornan19さんが提案している無名クラスを使うのは良い方法だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問