プロが教えるわが家の防犯対策術!

お世話になります。
abstract クラスについて質問させて下さい。

例えば、以下のような場合、


abstract class ErrorC {
abstract boolean errorKind( );
public void logOut( ) {
//ログを記録する処理を記述する
}
}

class DbError extends ErrorC {
boolean errorKind( ) {
//DB エラーが起こった時の処理を記述する
logOut( );
}
}

class IoError extends ErrorC {
boolean errorKind( ) {
//入出力エラーが起こった時の処理を記述する
logOut( );
}
}


・ErrorC クラスではエラーの種類に関わらず、ログを記録する処理を
 記述する。

・それ以外の個々のエラー毎の処理は各サブクラスに具体的な処理を
 実装させる。

ということで、プログラミングの作業量が軽減される等の利点は理解できる
のですが、それを実現するには、普通にクラスの継承を行えばいいような
気がするのです。

abstract クラスがどういうものなのか、ということは何となく理解できたのですが、
それを使用する利点が分かりません。

ご教授宜しくお願い致します。

A 回答 (3件)

abstractの存在意義は、「そのクラスのインスタンスの生成を禁止する」ことにあります。


ErrorCにabstractがつかないと、「ErrorCのインスタンス」を作ることが「できて」しまいます。
まあ作れてもかまわない場合もあるのですが、作りたくない場合も多々あります。
この場合だとErrorCのインスタンスが発生すると、
「あなたいったい何のエラーなの」
「いや、決まってないんだけど、とにかくエラーなんです」
「とにかくエラーじゃ困るよ。エラーだったら何のエラーか言ってもらわないと」
「いやほんとに単なるエラーで、何の種類のエラーか決まってないんです」
ということになります。
    • good
    • 0

最近abstractクラスを使っていて気づきました.



他人のソースを見るとき,abstractクラスを見ると一通りそのクラスの機能がわかる.
もう1つ,代表となる働きをするクラスをabstractにすると,他でその働きをするクラスを複数個作ったときに統一しやすい.

見当外れかな!?(゜ロ゜;)
    • good
    • 0
この回答へのお礼

ranxさん、liar_adanさん、shotaro777さん、ご回答ありがとうございました。

お礼が遅くなりましたことと、まとめてのご報告、失礼ですがお許し下さい。

おかげさまで、自分なりにいろいろと演習問題を解いてみた結果、
なんとなくですが、abstract クラスを使用する利点が分かりました。
(所詮演習レベルですが)

実際に現場で開発、となると、当然セキュリティの問題も深刻な問題に
なるでしょうし、アクセスレベルのことも掴み易くなるのでしょうね。

独学ですと、ついつい、「動いたからいいや」になってしまって…。
でも、これからも頑張って学習していこうと思います。

ご教授ありがとうございました。

お礼日時:2003/02/06 15:36

質問の例で、ErrorCクラスがabstractクラスで無い場合、


つまりErrorCクラスにabstractメソッドが宣言されていない場合、
次のような記述はできません。

class CertainClass{
void doWithError(ErroC certainError) {
boolean judge = certainError.errorKind();
.....
}
}

certainErrorが具体的にどのようなエラーなのかは分かりませんが、
それでもerrorKind()というbooleanを返すメソッドがあることは
分かっているので、それが利用できるわけです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!