メソッド (計算機科学)
抽象メソッド (abstract method) とは仮想メソッドの一種で、メソッドの実装が無く、宣言だけされているもののことである。C++では純粋仮想関数 (pure virtual function) と呼ばれる。このメソッドを利用するには、このメソッドを含むクラスを継承し、そこでこのメソッドをオーバーライドして実装する必要がある。従って、抽象メソッドを含むクラスは継承しない限りインスタンス化できない。このようなクラスを抽象クラスと呼ぶ。
具象メソッド (concrete method) は抽象メソッドの逆で、実装をもつメソッドのことである。主に抽象メソッドをオーバーライドしたインスタンスメソッドのことを意味するために使われる。
JavaおよびC#ではabstract修飾子を用いて抽象メソッドを宣言できる。抽象メソッドを持つクラス自体もまた、必ずabstract修飾子を使って抽象クラスとして定義しなければならない。
抽象メソッドはデザインパターンの一つTemplate Method パターンで主要な役割を果たす概念であり、ソフトウェアの拡張性、再利用性、汎用性を高めるのに役立つ。
また、抽象メソッドのみを持つ抽象型として、JavaおよびC#ではインターフェイス (interface) を定義できる。JavaおよびC#においてクラスは多重継承できないが、インターフェイスを複数実装することはできる。
Smalltalkによるインスタンスメソッドとクラスメソッドの例を示す。
インスタンスメソッドを実行するには、まずインスタンスオブジェクトを生成しなければならない:
上の例では #withGivenName: により二つのインスタンスオブジェクトを生成し変数 objectA と objectB に代入している。この時点で、objectA とobjectB のインスタンス変数 name にはそれぞれ "John" と "Joe" が代入されている。
インスタンスメソッドを実行するには次のように記述する:
上の例では objectA と objectB それぞれのインスタンスオブジェクトに対し #givenName メッセージを送りインスタンスメソッドを実行している。それぞれのメソッドの返り値が異なることから、同じクラスオブジェクトに属するインスタンスオブジェクトでもインスタンス変数が持つ値は、インスタンスオブジェクト毎に異なることがわかる。
一方、クラスメソッドを実行するには、クラスオブジェクトに直接属しているため、インスタンスオブジェクトの代わりにクラスオブジェクトに対してメッセージを送る。 クラスメソッドを実行するには次のように記述する:
C++では、一般に仮想関数はコンパイル時にどのメンバー関数を呼び出すかを確定できないため、通常の非仮想なメンバー関数呼び出しよりもパフォーマンスが悪いというデメリットがある。そのため、パフォーマンスを気にするC++プログラマには、継承する必要がないクラスのメンバー関数(特にデストラクタを含む)にvirtual修飾子をつけることを非常に嫌う傾向がある。また、C++にはtemplateという機能が存在し、多くの場合仮想関数はtemplateで代用できてしまうため仮想関数にこだわる必要がないという事情もある。ただし、デストラクタが非仮想の場合、派生クラスのインスタンスのポリモーフィックなdeleteが不可能となる、という利便性および安全上のデメリットも発生する。
メソッドがデフォルトで非仮想というC++に準ずる設計選択をしたC#においても、仮想メソッドの呼び出しには非仮想メソッドよりもコストがかかることを念頭に置いて利用する必要がある。