abstract クラスについて

このQ&Aのポイント
  • abstract クラスは、共通のメソッドやフィールドを持つ複数のクラスを一括管理するためのクラスです。
  • abstract クラスを利用することで、処理の共通化や再利用性の向上、プログラミングの作業量の軽減などの利点があります。
  • 具体的な処理内容は各サブクラスで実装することができ、エラーの種類に関わらず共通の処理を行うことができます。
回答を見る
  • ベストアンサー

abstract クラスについて

お世話になります。 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 クラスがどういうものなのか、ということは何となく理解できたのですが、 それを使用する利点が分かりません。 ご教授宜しくお願い致します。

  • Java
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

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

その他の回答 (2)

回答No.3

最近abstractクラスを使っていて気づきました. 他人のソースを見るとき,abstractクラスを見ると一通りそのクラスの機能がわかる. もう1つ,代表となる働きをするクラスをabstractにすると,他でその働きをするクラスを複数個作ったときに統一しやすい. 見当外れかな!?(゜ロ゜;)

daisy_k
質問者

お礼

ranxさん、liar_adanさん、shotaro777さん、ご回答ありがとうございました。 お礼が遅くなりましたことと、まとめてのご報告、失礼ですがお許し下さい。 おかげさまで、自分なりにいろいろと演習問題を解いてみた結果、 なんとなくですが、abstract クラスを使用する利点が分かりました。 (所詮演習レベルですが) 実際に現場で開発、となると、当然セキュリティの問題も深刻な問題に なるでしょうし、アクセスレベルのことも掴み易くなるのでしょうね。 独学ですと、ついつい、「動いたからいいや」になってしまって…。 でも、これからも頑張って学習していこうと思います。 ご教授ありがとうございました。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

質問の例で、ErrorCクラスがabstractクラスで無い場合、 つまりErrorCクラスにabstractメソッドが宣言されていない場合、 次のような記述はできません。 class CertainClass{ void doWithError(ErroC certainError) { boolean judge = certainError.errorKind(); ..... } } certainErrorが具体的にどのようなエラーなのかは分かりませんが、 それでもerrorKind()というbooleanを返すメソッドがあることは 分かっているので、それが利用できるわけです。

関連するQ&A

  • abstractメソッドの使い方

     漠然とした質問になりますが、よろしくお願いします。 今、前の人が記述したソースを読んでおりまして、 抽象クラスのメソッドの使い方で疑問が生じました。 lookメソッドに注目して頂きたいのですが、 public abstract class Editor { protected abstract boolean look() throws Exception; ・・・・・・・・・・・・ if(! this.look()) {   // ★ return false; } という記述があります。Editor クラスにはこの2つ以外のlookメソッドはありません。 そのためlook()では他のクラスで実装した戻り値が返ってくるはずですが、 thisを監視してデバックすると★の行上に処理のラインが来たとき、 thisにlookメソッドを含まないクラス名が表示されます。 thisがEditor でない事自体よく分かりません・・ abstractはあまり使ったことが無く、どこで実装されているのか(正確には、実装されているクラスのうちここで使われているのはどのクラスのlookメソッドか)を知りたいです。 知っている限りの方法では特定できませんでした。 よろしければアドバイスをお願いします。

    • ベストアンサー
    • Java
  • スーパークラスとサブクラスについて

    Parent pc = new Children(); pc.getName(); 下記、2つのクラスがある状態で上記のようにしてgetName()を実行したところ サブクラスのgetName()が呼ばれました。このことからpcオブジェクトの実態はChildrenクラス なのだと理解していたのですが、サブクラスにしか存在しないメソッドを呼ぼうとして pc.getChildName()と記述したところコンパイルエラーになってしまいました。 pc.getParentName()となら記述することができるのですがpcオブジェクトのをどう理解すれば よいのでしょうか。 【親クラス】 public class Parent { public void getName() { System.out.println("Parent"); } public void getParentName() { System.out.println("親クラス特有のメソッド"); } } 【サブクラス】 public class Children extends Parent{ @Override public void getName() { System.out.println("Children"); } public void getChildName() { System.out.println("サブクラス特有のメソッド"); } }

    • ベストアンサー
    • Java
  • アブストラクトとインターフェースの簡単な一例文

    JAVAについて質問よろしくお願いします。 abstract抽象クラスとインターフェースについて下記理解なのですが、超かんたんな一例など欲しいのですが何かないでしょうか。たとえば package round1.chapter1; public class Helloworld { public static void main(String[] args) { System.out.println("こんにちは!"); } } というような一文です。 ~私の理解~ アブストラクトとは、違ったクラス内で同一メソッドがある場合は親クラスに置き、違ったメソッドがある場合は抽象クラスとして親クラスに置いて、実装はサブクラスに任せるという形式で使われる言葉 インターフェースとは、機能だけを仕様書として書いておき、定義されたとおりのメソッドを実装しないといけないという呼び出し方の統一を図る際に使われるメソッド置き場 ~~~~~ このふたつについてものすごく簡単な使用例を頂きたいです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaの配列とクラス

    abstract class abstract_class{ } class subclassA extends abstract_class{ int num = 1; } class subclassB extends abstract_class{ int num = 2; } class subclassC extends abstract_class{ int num = 3; } class Main{ public static void main(String args[]){ int sum = 0; abstract_class var[] = new abstract_class[3]; var[0] = new subclassA(); var[1] = new subclassB(); var[2] = new subclassC(); for(int i=0;i<3;i++) sum += var[i].num; System.out.println(sum); } } これをコンパイルすると Main.java:23: シンボルを見つけられません。 シンボル: 変数 num 場所 : abstract_class の クラス for(int i=0;i<3;i++) sum += var[i].num; ^ エラー 1 個 というエラーが出るのはなぜでしょうか? var[i]はみなsubclassA,subclassB,subclassCが代入されているのに、numはabstract_classの変数となっています。 よくわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 継承(extends)について

    extendsについてわからないことがあります。 次の3つのクラスがあった時、 class スーパークラス { ... class サブクラス1 extends スーパークラス { ... class サブクラス2 extends サブクラス1 {... サブクラス2は、サブクラス1でスーパークラスから継承しているフィールドをメソッドを継承するのでしょうか?

    • ベストアンサー
    • Java
  • abstract と static を一緒に付けることはある?

    抽象クラスの抽象メソッドにstaticを付ける(abstract と static をメソッドに一緒に付ける)ことはありますか? 例えば、 abstract class Super {  static abstract void meth(); } class Sub extends Super {  static void meth() {   System.out.print("hello");  } } として、mainの中に  Sub.meth(); を書いてみたのですが、普通にコンパイルは通りhelloが出力されます。 staticの意味を考えると、こういうことをするのは意味がないと思うのですが、独学なので身近に聞ける人もいません。 御教授よろしくお願いします。

  • インターフェイス 抽象クラス

    PHP初心者です。 xampp1.7.0(最新)でアパッチなど一括ダウンロード クラスの概念は分かりましたが、インターフェイス、及び抽象クラスについて理解が追い付きません。 下記コードをご覧ください。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <? abstract class AbstractClass { abstract public function test1(); } class Impl1 extends AbstractClass { public function test1() { print "こんにちは\n"; } } class Impl2 extends AbstractClass { public function test1() { print "ありがとう.\n"; } public function hoge() { print "さようなら\n"; } } $i1 = new Impl1(); $i1->test1(); $i2 = new Impl2(); $i2->test1(); ?> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 抽象クラスが上にありますが、中身がないので継承し、そのクラスの中で処理させています。抽象クラスの必然性が理解できません。まあこのコード事態がものすごく短いので、その必然性がないと思うのですが、例えばもっと長いコードになったときなどは抽象クラスは絶対使った方がいいということになるのでしょうか。 さらに全て抽象クラスであればインターフェイスを利用できるようですが、インターフェイスのメリットにつき理解が追い付きません。 どなたかご教授お願いいたします。

    • ベストアンサー
    • PHP
  • abstractに関する質問

    現在Javaでオブジェクト指向を勉強しながらプログラムを組んでいるのですが、疑問が出たので質問させていただきます。 いきなり例をあげて説明させていただくのですが abstract class 図形 { } class 円 extends 図形 {  public int r; } class 紙 {  図形 a;//メンバ変数  int main()  {   図形 a = new 円();   a.r;///できない  } } このようなクラスがあった場合 紙クラスの中で 「a.r」というようなことがしたいのですが、うまくアクセスできません。 どのようにすればアクセスできるのでしょうか?

    • ベストアンサー
    • Java
  • 派生クラスをリストする

    Stringであらわせる独自のデータ形式がいくつかあり、次のようにして、 abstract class DataType{ //このファイル形式かどうかを判定する abstract boolean isThisDataType(String s); } class DataTypeA extends DataType{ boolean isThisDataType(String s){...} } class DataTypeB extends DataType{ boolean isThisDataType(String s){...} } class ManagerOfDataType{ DataType[] getAllSupportedDataTypes(){...} //サポートしているすべてのデータ形式を取得 DataType FindBestDataType(String s){ for(i=0;i<getAllSupportedDateTypes().length();i++){ if(getAllSupportedDataTypes()[i].isThisDataType(s)){ return getAllSupportedDataTypes()[i]; } } } } のようにして、どのデータ形式でも対応できるようにしたいと思っているのですが、わからないのは、「サポートしているすべてのデータ形式を取得」、すなわち、DataTypeの派生クラスをすべて取得するところです。 DataTypeA,BのコンストラクタでstaticなListに自分のクラス名を登録していくなどの方法も思いついたのですが、それでは、DataTypeA,Bのインスタンスを生成したときしか登録が実行されませんよね?宣言すると同時に、登録が実行されるような方法はありますでしょうか? もっとスマートなデザインパターンがあるぞ、という話でも、お教えくだされば幸いです。

    • ベストアンサー
    • Java
  • スーパークラスのコンストラクタの呼び出し

    こんにちは。 スーパークラスに引数のあるコンストラクタと引数のないコンストラクタをサブクラスで継承する際の質問です。 具体的に書くと下記になります。 class A { A () {} A (int i) {} } class B extends A { } 何がわからないかというと 『スーパークラスのA()は、サブクラスのBでわざわざ明示的にスーパークラスのコンストラクタ呼び出しをしなくても問題ないというのはわかるのですが、なぜスーパークラスのA(int)は、呼び出さなくても良いのかということです。』 もしかしたら基礎中の基礎かもしれませんが、ご教授よろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう