@IT会議室は、2009年4月15日に新システムに移行し、さらに2012年5月29日にITエンジニアに特化した
質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用くださいませ。
- PR -

抽象クラスについて。

投稿者投稿内容
omopurike
常連さん
会議室デビュー日: 2008/04/03
投稿数: 38
投稿日時: 2008-04-11 23:12
普通抽象クラスはインスタンスは作成できませんが。。。。
抽象クラスを継承してabstract定義されているメソッドを定義しなおせば抽象クラスではなくなるので、インスタンスを作成できこれにより、抽象クラスの変数としてインスタンスを作成できるらしいですが
これによりいったい何ができるようになるのですか?

otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-04-12 00:29
抽象クラスはオブジェクト指向と関係があります。
コンピュータとしてできることが増えるわけではないですが
これがあるとオブジェクト指向設計がしやすくなります。

オブジェクト指向によってどんな恩恵があるか調べてみるとよいと思います。
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-04-12 10:32
・抽象クラスはインスタンスは作成できない
⇒ 言語仕様でそうなっています。

・抽象クラスを継承してabstract定義されているメソッドを定義しなおせば抽象クラスではなくなる
⇒ 当然ながら、インスタンスが生成できるようになります。
  この時点で、抽象クラスではありません。

・抽象クラスの変数としてインスタンスを作成できる
⇒ この部分が理解されていない箇所です。

変数の型とインスタンスの型は必ずしも一致する必要はありません。
もの凄く簡単に言えば、インスタンスの型よりも変数の型の方がより抽象的な型でであれば構いません。
言語仕様的には、変数の型はインスタンスの型のスーパークラスであれば自然に代入などが可能です。
どうしてこのような仕様になっているかは、まだ学習する段階に達していないと思いますが、オブジェクト指向の勉強をしていく中で学ぶと思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-04-12 12:01
引用:

omopurikeさんの書き込み (2008-04-11 23:12) より:
抽象クラスを継承してabstract定義されているメソッドを定義しなおせば抽象クラスではなくなるので、インスタンスを作成できこれにより、抽象クラスの変数としてインスタンスを作成できるらしいですが
これによりいったい何ができるようになるのですか?


・インスタンスを作成できるようになります。
・作成できたインスタンスのメソッドやフィールドにアクセスできるようになります。
・…

「メソッドを定義しなおせば」と書かれていますが、定義し直すというよりは、定義がないので定義する、と言うほうが良いかもしれません。

(以下、追加。)
「定義はあるが実装がないので実装する、のほうが適切でしょうか。

[ メッセージ編集済み 編集者: unibon 編集日時 2008-04-12 12:07 ]
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-04-12 21:02
引用:

これによりいったい何ができるようになるのですか?


クラスについて理解したら、次は抽象クラスではなくインターフェイスについて学びましょう。クラスとインターフェイスを理解したら、ポリモーフィズム(多態性)について学びましょう。ここまで理解すれば、抽象クラスのことが 3分で理解できるようになっているはずです。

抽象クラスとは、インターフェイス+(一部の)実装コード のことなのです。

引用:

抽象クラスの変数としてインスタンスを作成できる


これが多態性。別に抽象クラスでなくても、親クラスの型にも代入できたでしょ?

まあ、抽象クラスについて時間をかけて学ぶ必要はないですよ。抽象クラスを理解できていないということは、インターフェイスや多態性を理解できていないということだろうから、まずはそちらを理解するのが良いと思います。
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-04-12 22:29
コード:

class ABase {
//ログとか
}
abstract class AbsA extends ABase {
protected abstract boolean xxx(DataSet ds);
public void actionXXX(DataSet o) {
if (xxx(o)) yyy();
else zzz();
}
private void yyy() {}
private void zzz() {}
}
class BAbsA extends AbsA {
protected boolean xxx(DataSet ds) {
//B クラス固有の処理
return true;
}
}
class CAbsA extends AbsA {
protected boolean xxx(DataSet ds) {
//C クラス固有の処理
return false;
}
}

public void main() {
List<AbsA> list = new List();
list.add(new BAbsA());
list.add(new CAbsA());
Iterator it = list.iterator();

DataSet ds = dbconn.executeQuery("SELECT * FROM SYSDUMMY1");

while (it.hasNext()) {
it.next().actionXXX(ds);
}
}



呼び出し同じで中身はどーでもいい、ってのが「たたいせい」なんじゃ?

で、
「何が出来るのか?」
ですが、統一ルールのもとに処理を必要な時と場所に応じて
動的に(作りこんだ機能のみを任意に)変更できるってのが
メリットだと認識しています。

親クラス変数に子クラスを代入できるってのは、ただの仕様。
「たたいせい」以前の継承のお話かと。
渡辺さん家の子供の芳江さん
親 oya = 渡辺さん
子 ko = 渡辺さん


>抽象クラスについて時間をかけて学ぶ必要はないですよ
いや、重要です。自分で組む機会はそうそう無いけど。


検索キーワード:多態性
http://msugai.fc2web.com/java/polymorphism.html
http://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0
http://oshiete1.goo.ne.jp/qa1439975.html

訂正:コード/コード追加

また訂正ばっかし・・・
訂正2:一部文言訂正。
インターフェースとの違いは自分流解釈では、インターフェースはオプション。
アブストラクトは強制。どちらも作り手に実装の幅を広げるものであると理解
しています。



[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-04-12 22:31 ]

[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-04-12 22:38 ]
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-04-13 12:27
引用:

>抽象クラスについて時間をかけて学ぶ必要はないですよ
いや、重要です。自分で組む機会はそうそう無いけど。


なにか誤解しているようですね。私は抽象クラスが重要ではないとは一言も言っていませんよ。簡単に理解できる日が来るから、時間をかけて学ぶ必要はないと言っています。抽象クラスなんて簡単なものが理解できないはずはないです。抽象クラスが理解できないと思っている人は、そもそも、インターフェイスや多態性が理解できていないのでしょう。

引用:

インターフェースとの違いは自分流解釈では、インターフェースはオプション。アブストラクトは強制。


「オプション」とか「強制」の意味が分かりませんが、重要度では

インターフェイス >>>> (越えられない壁) >>>> 抽象クラス

ですよ。抽象クラスは略記法みたいなもので、なければないで誰も困りません。そういう意味では抽象クラスこそオプションだと思いますけどねえ。学習という観点では、抽象クラスなんて完全にオプション。時間をかけて学ぶようなものではないです。
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-04-13 13:09
喧嘩売るような書き込みすみません。
以後気をつけます。

抽象クラスは重要じゃないのですね・・・
結構頻繁に使うものなんですが。僕の環境だけが頻繁に使うものであって
世間では重要視されない付録みたいな扱いなんですか。
うーむ。
世間知らずでした。

アイティメディアの提供サービス

ホワイトペーパー(TechTargetジャパン/閲覧には会員登録が必要です)

スキルアップ/キャリアアップ(JOB@IT)