• 締切済み

抽象クラスについて

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

みんなの回答

回答No.1

すべて定義しておく必要はないです。 逆にそういうものであれば継承という仕組みの意味が薄くなる。 抽象化というのは物を概念と特徴に分けるような感じです。 例えばオセロというゲームを抽象化してみると ボードゲームというぼんやりしたものが浮かび上がります。 これが親クラスになります。 マップの配列のみを親クラスが持って それを継承したオセロクラスが白黒のコマやルールを実装します。 同じようにボードゲームで将棋を追加したい場合には ボードゲームを継承した将棋クラスが駒やルールを実装します。 まぁ例が分かりにくかったかもしれませんが 派生クラスはオリジナル性の部分を実装してください。

wave_sc
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

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

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

  • 基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

    VC++でプログラミングをしています。 A(基本クラス) B(派生クラス) を作成しました。Bは、Aの特別な場合です。 このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか? 基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。 (純粋仮想関数という方法もあるようですが、) 操作としましては、 Aのポインタ配列 A* a[100]を作成し 特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。 派生クラスにのみあるメンバ関数を、Readとします。 for(i=0;i<100;i++){ if(派生クラスBの場合){ a[i]->Read() } } 現状では、コンパイルエラーで、 関数Readは、aのメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。

  • 抽象クラスとインタフェースの違いは?

    基本的なことかもしれなのですが、疑問に思ったのですが、抽象クラスとインタフェースは、どういう違いがあるのでしょうか? 実際にそれぞれ定義してみるとあまり違いが無いような気がしてしまいます。 「抽象クラスは、抽象データ型を定義するもの」で「インターフェースは、オブジェクトのインターフェースを定義するもの」という解釈でいいのでしょうか? 意味的な違いはあっても実際は、同じもののような気がするのですが、どう違うのでしょうか?

    • ベストアンサー
    • 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
  • インターフェイスと抽象クラス

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

    • ベストアンサー
    • Java
  • クラス メンバ関数インライン化

    クラス内でメンバ関数を定義するとインライン関数になると書いてあったのですが、全てクラス内でメンバ関数を定義してはだめなのでしょうか?   クラス外でメンバ関数を定義するメリットを教えてください。 教えてくださいm(_ _ )m

  • 抽象クラスとインターフェースの使い分け

    抽象クラスとインターフェース、この2つの違い、使い分け方が未だにはっきりとはわかりません・・・ 抽象クラスもインターフェースも実装は持たず、抽象クラスはサブクラスで、インターフェースはそれをインプリメントしたクラスで実装を行うのですよね? 両者ともに言わば中身はなく外枠だけ定義されていると言えると思うのですが、だとしたらこの2つの違いや使い分けってどうなるのでしょうか。 抽象クラスでは部分的な実装を含められることや、インターフェースでは実装クラスが全てのメソッドを実装しなければいけない、複数実装できるといった使い方の違いしかないのでしょうか。 だとしたら実際に抽象クラスとして用意するのかインターフェースとして用意するのかの選択基準はなんなのでしょうか。 明確にこういう場合は抽象クラス、こういう場合はインターフェースなどと言った使い分けってあるのでしょうか。

  • 抽象クラスのメリット

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

    • ベストアンサー
    • 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
  • 抽象クラスをJUNITでテストする方法

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

    • ベストアンサー
    • Java

専門家に質問してみよう