No.2ベストアンサー
- 回答日時:
抽象クラスを使うということは、抽象クラスのメソッドは実装しないってことです。
普通のクラスを継承する場合は、オーバーライドする親クラスのメソッドは実装しなければコンパイルエラーになります。
空実装をしておけばいいですが、実際に実装する立場からすると抽象化しておくことで、明示的に実装させることができます。
「オーバーライドを忘れない」というメリットは、決してパンチが弱いものではありません。
自分で抽象クラスを作って、自分で実装をするならそう思うかもしれませんが、フレームワークとして公開することによって、その実装を知らなくても安全に使えるということにつながります。
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重量(){ ... };
抽象クラスが無かったら、まさに日常的に抽象的な二輪車というような
クラスを書き表すことができなくなってしまうという事です。
これは、郵便自転車も原動機付自転車も、二輪車の一種ですが
抽象クラスが無かったら、継承したインターフェースのメソッドを
それぞれのクラスに(同じ内容を含めて)一次元的に
全て羅列するか、全てを実装した具象クラスを継承するしか
方法がなくなります。
抽象クラスの存在によってインターフェースを実装するときの
利便性が増し、クラス構造の見通しが良くります。
>オーバーライドする事を忘れない、というメリットでは
>パンチが弱い気がします。
これは、インターフェースの存在意義であって、抽象クラスの
存在価値は違うと思われます。
No.1
- 回答日時:
複数のクラスに、まったく同一のメソッドが存在することを保証できる、ということでしょうか。
単に「メソッドがある」ということでなく、保障される、という点です。たとえば、あるクラスAに「func」というメソッドを用意したとします。これを、その他のクラスから呼び出してfuncを利用する場合を考えてください。抽象クラスを継承して作っても、そうでなくても、基本的には同じですね。newでインスタンスを作り、funcを呼び出す。この時点では、違いはほぼありません。
では、このfuncを実装したクラスBを新たに作る必要ができたとしましょう。そして、これらのクラスを利用するクラスも作成をします。ただし、ここでは「クラスAとBのどちらが渡されるかは、その場にならないとわからない」とします。このとき、どうやってこの処理を作りますか?
抽象クラスを使えば簡単です。抽象クラスXを作成し、これを継承してクラスAとクラスBを作ります。利用する側は「クラスXのfuncを呼び出す」という形で処理します。これは、クラスAが渡されてもBが渡されても、まったく問題なく動きます。もちろん、新たにクラスCやDが増えても、プログラムを修正する必要はまったくありません。
まぁ、同様のことはインターフェイスでもできるわけですが、このように「メソッドを保障したクラスを複数作成する」というような場合、抽象クラス(や、インターフェイス)は便利なのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#】クラスのコンストラクタ...
-
interface,extend,implementの...
-
デバッグ時に「Source not found」
-
setTextについて
-
抽象クラスをJUNITでテストする...
-
抽象クラスとインタフェースの...
-
Excel vbaのプログラムでガンマ...
-
VB DLLプロジェクトについて
-
cocoa、objective-cのクラスを...
-
インタフェースのstatic変数(Java)
-
インナークラスについて
-
単体テストのテストケースにて...
-
C#からDLLを呼びたいのですが・...
-
タイマーの作り方
-
Java StringBuilderクラスについて
-
肥大化した実装クラスを分割す...
-
インターフェースとは
-
Javaの自作例外クラスについて
-
javaのabstractの意味
-
インターフェース型の使い方が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ラッパークラス」の存在意義...
-
C# 「データが失なわれる可能性...
-
VB DLLプロジェクトについて
-
抽象クラスをJUNITでテストする...
-
「継承されたメソッドの可視性...
-
インターフェースとトレイトっ...
-
c++でのヘッダーファイルの循環...
-
JavaでのAPIの覚え方ってみさな...
-
(vba)他のアプリケーションの右...
-
ASP.NETでの共通コードの書き方...
-
なぜForm型にキャストするので...
-
vb.net 自作プロパティの削除に...
-
【C#】クラスのコンストラクタ...
-
委譲って何ですか?
-
interface,extend,implementの...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
Commons-Discovery.jarとは?
-
JTextFieldの入力制限
-
C#からDLLを呼びたいのですが・...
おすすめ情報