プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (3件)

複数のクラスに、まったく同一のメソッドが存在することを保証できる、ということでしょうか。

単に「メソッドがある」ということでなく、保障される、という点です。

たとえば、あるクラスAに「func」というメソッドを用意したとします。これを、その他のクラスから呼び出してfuncを利用する場合を考えてください。抽象クラスを継承して作っても、そうでなくても、基本的には同じですね。newでインスタンスを作り、funcを呼び出す。この時点では、違いはほぼありません。

では、このfuncを実装したクラスBを新たに作る必要ができたとしましょう。そして、これらのクラスを利用するクラスも作成をします。ただし、ここでは「クラスAとBのどちらが渡されるかは、その場にならないとわからない」とします。このとき、どうやってこの処理を作りますか?

抽象クラスを使えば簡単です。抽象クラスXを作成し、これを継承してクラスAとクラスBを作ります。利用する側は「クラスXのfuncを呼び出す」という形で処理します。これは、クラスAが渡されてもBが渡されても、まったく問題なく動きます。もちろん、新たにクラスCやDが増えても、プログラムを修正する必要はまったくありません。

まぁ、同様のことはインターフェイスでもできるわけですが、このように「メソッドを保障したクラスを複数作成する」というような場合、抽象クラス(や、インターフェイス)は便利なのです。
    • good
    • 0

抽象クラスを使うということは、抽象クラスのメソッドは実装しないってことです。


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

例えば、以下のような日常的で具体的な問題のオブジェクト構造を


考えてみて頂ければ抽象クラスの恩恵を実感できると思います。

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重量(){ ... };


抽象クラスが無かったら、まさに日常的に抽象的な二輪車というような
クラスを書き表すことができなくなってしまうという事です。

これは、郵便自転車も原動機付自転車も、二輪車の一種ですが
抽象クラスが無かったら、継承したインターフェースのメソッドを
それぞれのクラスに(同じ内容を含めて)一次元的に
全て羅列するか、全てを実装した具象クラスを継承するしか
方法がなくなります。

抽象クラスの存在によってインターフェースを実装するときの
利便性が増し、クラス構造の見通しが良くります。

>オーバーライドする事を忘れない、というメリットでは
>パンチが弱い気がします。
これは、インターフェースの存在意義であって、抽象クラスの
存在価値は違うと思われます。
    • good
    • 2

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