• ベストアンサー

抽象クラスのメリット

抽象クラスを作成して、オーバーライドするならば、 普通のクラスを作成してオーバーライドしても同じ ではないでしょうか。 オーバーライドする事を忘れない、というメリットでは パンチが弱い気がします。 他に抽象クラスを使用する事によってのメリットは ありますでしょうか?

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

  • ベストアンサー
noname#49428
noname#49428
回答No.2

抽象クラスを使うということは、抽象クラスのメソッドは実装しないってことです。 普通のクラスを継承する場合は、オーバーライドする親クラスのメソッドは実装しなければコンパイルエラーになります。 空実装をしておけばいいですが、実際に実装する立場からすると抽象化しておくことで、明示的に実装させることができます。 「オーバーライドを忘れない」というメリットは、決してパンチが弱いものではありません。 自分で抽象クラスを作って、自分で実装をするならそう思うかもしれませんが、フレームワークとして公開することによって、その実装を知らなくても安全に使えるということにつながります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.3

例えば、以下のような日常的で具体的な問題のオブジェクト構造を 考えてみて頂ければ抽象クラスの恩恵を実感できると思います。 interface 乗り物  get車軸長();  get重量();  get定員数();  get車輪数(); abstract class 二輪車 implements 乗り物  get定員数(){ return 1 };  get車輪数(){ return 2 }; abstract class 大型二輪 extends 二輪車  get定員数(){ return 2 }; class 郵便自転車 extends 二輪車  get車軸長(){ ... };  get重量(){ ... }; class 原動機付自転車 extends 二輪車  get車軸長(){ ... };  get重量(){ ... }; class 白バイ extends 大型二輪  get車軸長(){ ... };  get重量(){ ... }; 抽象クラスが無かったら、まさに日常的に抽象的な二輪車というような クラスを書き表すことができなくなってしまうという事です。 これは、郵便自転車も原動機付自転車も、二輪車の一種ですが 抽象クラスが無かったら、継承したインターフェースのメソッドを それぞれのクラスに(同じ内容を含めて)一次元的に 全て羅列するか、全てを実装した具象クラスを継承するしか 方法がなくなります。 抽象クラスの存在によってインターフェースを実装するときの 利便性が増し、クラス構造の見通しが良くります。 >オーバーライドする事を忘れない、というメリットでは >パンチが弱い気がします。 これは、インターフェースの存在意義であって、抽象クラスの 存在価値は違うと思われます。

全文を見る
すると、全ての回答が全文表示されます。
noname#49664
noname#49664
回答No.1

複数のクラスに、まったく同一のメソッドが存在することを保証できる、ということでしょうか。単に「メソッドがある」ということでなく、保障される、という点です。 たとえば、あるクラスAに「func」というメソッドを用意したとします。これを、その他のクラスから呼び出してfuncを利用する場合を考えてください。抽象クラスを継承して作っても、そうでなくても、基本的には同じですね。newでインスタンスを作り、funcを呼び出す。この時点では、違いはほぼありません。 では、このfuncを実装したクラスBを新たに作る必要ができたとしましょう。そして、これらのクラスを利用するクラスも作成をします。ただし、ここでは「クラスAとBのどちらが渡されるかは、その場にならないとわからない」とします。このとき、どうやってこの処理を作りますか? 抽象クラスを使えば簡単です。抽象クラスXを作成し、これを継承してクラスAとクラスBを作ります。利用する側は「クラスXのfuncを呼び出す」という形で処理します。これは、クラスAが渡されてもBが渡されても、まったく問題なく動きます。もちろん、新たにクラスCやDが増えても、プログラムを修正する必要はまったくありません。 まぁ、同様のことはインターフェイスでもできるわけですが、このように「メソッドを保障したクラスを複数作成する」というような場合、抽象クラス(や、インターフェイス)は便利なのです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 抽象メソッド、抽象クラス

    C#を勉強しております。Javaにも同じ機能がありC#のカテゴリーがない為こちらで質問させていただきます。抽象メソッドや抽象クラスを使う利点に関してです。 これらを使う利点を調べたところオーバーライドさせられると書いてありました。オーバーライドしないと 実装がないのでエラーになると書いてありました。その点は理解できたのですが何故基本クラスで実体のない定義をする利点がよくわかりません。それなら最初から派生クラスの方にメソッドを定義すればいいのではという考えになりました。 抽象メソッドとして実体のない定義を行う利点なるものを教えてください。 よろしくお願いします。

  • 抽象クラスのオブジェクトを生成できない理由は?

    ・抽象クラスは、なぜ(オーバーライドしないと)オブジェクトを生成できないのでしょうか? ・インタフェースみたいに、抽象メソッドしか宣言することができないなら話は分かるのですが… ・抽象メソッドでない普通のメソッドを実装できるのなら、オブジェクトを生成してくれても良いと思うのですが… ・そういう問題ではない?

    • ベストアンサー
    • Java
  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 抽象クラスについて

    抽象クラスを使って派生クラスを作成していて疑問になったのですが、派生クラスで作るメンバ関数は、抽象クラスで仮想関数としてすべて定義しておくべきなのでしょうか。ご教授願います。

  • 抽象クラスの継承について

    すいませんがご教授下さい。 ASP.NETとVB.NETを使用してアプリを開発しています。 存在するクラスは以下のようなクラスです。 (WebForm1.aspxとWebForm1.aspx.vbとClass1.vb(抽象クラス)があります。) したい事はClass1.vbをWebForm1.aspx.vbが継承したいのですが継承させた後にWebForm1.aspxを開こうとすると「Webフォームデザイナにファイルを読み込めませんでした。・・・・」とエラーポップアップが表示されます。「はい」でHTMLは見れるのですがデザインはタブ自体がないです。普通のクラスを継承させると問題ないのですが。抽象クラスだとエラーになります。 対処方を教えて下さい。

  • UMLモデリング:抽象クラスを導入すべきかどうか

    オブジェクト指向設計に詳しい方,UMTP L3合格者の方,下記のような状況でクラスA1とクラスA2に抽象クラスAを導入するべきかしないべきかについて教えてください。 1 A1とA2に共通の属性は少ない。 2 ある抽象クラスBのサブクラスB1がA1に対する関連を持ち,B2がA2に対する関連を持つ。  また,これらの関連のロール名は同じ。 3 他の複数のクラスがサブクラスA1またはA2に対して関連を持っている。 1に関して:共通化できる箇所が少ないので抽象クラスを導入するメリットはないと思います。 2に関して:抽象クラスを導入することで,A1→B1とA2→B2の関連をA→Bの関連に纏められます。 3に関して:個々のサブクラスを意識する必要があるので抽象クラスを導入するメリットはないと思います。 抽象クラスを導入するメリットは,2に記載の関連を纏められるという点だけだと思いますが,まとめて良いかどうか疑問に思っています。A1->B2やA2->B1が許されないので,A->Bに纏めてしまうとモデルの意味が曖昧になりますし,コンパイル段階でA1->B2のような不正な組み合わせを検出できなくなります。しかし,Factoryとかを使って正しい組み合わせだけが生成されるようにすればよいので纏めるべきでしょうか。ロール名が同じなので,生成時だけ気をつければ同じ型で扱える方が良いようにも思います。 ちなみにこれはUMTP L3で出題された問題なのですが,細かい条件が提示されてなくて,Factoryの使用を前提にしてよいかは記載されていませんでした。記載がないということは前提にしない方が良いといことだと理解しています。 A1とA2はBから同じロール名で誘導されるという点を除けば,A1とA2は違う概念を表していると思います。A1とA2を独立したクラスにしておくべきか,抽象クラスで纏めるべきか教えてください。 宜しくお願いします。

  • 抽象クラスをJUNITでテストする方法

    抽象クラス内に実装メソッドと抽象メソッドがある場合に、 そのクラスをJUNITでテストしたいと思っています。 通常のクラスであれば、そのクラスに対するテストクラスを 作成して、テストクラス内でテスト対象クラスをnewして テストケースを記述していくと思いますが、 上記のような抽象クラスの場合は、 どういった形でテストクラスを作成すれば良いのでしょうか? 抽象クラスはnewできないので、 抽象クラスを実装したクラスをまず作成して そのクラスに対するテストクラスを作成するのでしょうか? お薦めの方法や一般的な方法があれば教えてください。 以上、よろしくお願い致しますm(__)m 【環境】 JDK1.4.2 JUNIT3.8.1

    • ベストアンサー
    • Java
  • インターフェイス 抽象クラス

    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
  • 抽象クラスについて<Java>

    「抽象クラス」は一体何のためにあるのか教えてください。どのような場面で使用するとその効力が味わえるのかも教えていただきたいです。具体的に分かりやすい例を挙げて説明してくれるとうれしいです。 非常に困ってますので、よろしくお願いします!!

    • ベストアンサー
    • Java
  • 抽象クラスからオーバーライドについて

    EclipseでJavaを勉強始めました。 抽象クラスからオーバーライドするところで質問致します。 抽象クラスとして、「面積を計算する」というメソッドをもつDiagramクラスを定義しました。それを継承して、「四角形の面積を計算する」というメソッドをもつSquareクラスと、「三角形の面積を計算する」というメソッドをもつTriangleクラスを定義しました。 Squareクラス、Triangleクラスからインスタンスを生成して、四角形、三角形の面積をコンソールに表示させるという簡単なプログラムです。 このとき、main関数と3つのクラスの関係についてお尋ねします。 (1)iagram.java、Square.java、Triangle.javaそれぞれにクラス定義とmain関数を持たせるパターン public abstract class Diagram { // 面積計算定義(抽象メソッド) public static void main(String[] args) { } } public class Square extends Diagram{ //四角形の面積の計算定義 public static void main(String[] args) { //四角形の面積の計算と表示 } public class Triangle extends Diagram{ //三角形の面積の計算定義 public static void main(String[] args) { //三角形の面積の計算と表示 } (2)sample.javaというファイルにまとめ、その中にこの3つのクラス定義とmain関数を一つ持たせるパターン public class sample { public static void main(String[] args) { //四角形の面積の計算と表示 //三角形の面積の計算と表示 } } abstract class Diagram { // 面積計算(抽象メソッド)定義 } class Square extends Diagram{ //四角形の面積の計算定義 } class Trapezoid extends Diagram{ //三角形の面積の計算定義 } この二通りを考えて、どちらも実行できたのですが、どちらの方がJavaらしいプログラムと思われますでしょうか?

    • ベストアンサー
    • Java
このQ&Aのポイント
  • ネットワークプリンターを使用している際に用紙切れが発生し、カートリッジを交換しても印刷できない問題が発生しました。
  • 印刷ジョブの表示では用紙切れの表示が出ており、プリンターの追加から設定をやり直すと印刷ができるようになりますが、頻繁にこの問題が発生します。
  • より簡単な対処方法を教えていただきたいです。
回答を見る