はじめに
Clean Architecture を読んでいたら「動的ポリモーフィズム」という単語が出てきて、読んだだけではあまり理解できなかったので自分のためにわかりやすくまとめてみました。
要約
静的ポリモーフィズム:コンパイル時に解決されるポリモーフィズム
動的ポリモーフィズム:実行時に解決されるポリモーフィズム
ポリモーフィズムの復習
ポリモーフィズムはオブジェクト指向における概念の一つです。
簡単に説明すると、同じ名前のメソッドの呼び出しに対して異なる機能・動作をさせることです。
詳細はこちらの記事が個人的にわかりやすかったです。
静的ポリモーフィズム
静的ポリモーフィズムは、コンパイル時に解決されるポリモーフィズムです。
Javaにおいては、オーバーロードがこれに当たります。
オーバーロードとは、引数の数とか型が違う、同じ名前のメソッドを複数個定義することです。そのため、オーバーロードをすることで「同じ名前のメソッドの呼び出しに対して異なる機能」を持たせることができ、ポリモーフィズムも実現されていると言えます。
例えば、以下のようなコードは testMethod
をオーバーロードしています。
class Test {
public void testMethod(){
System.out.println("テストメソッド その1");
}
public void testMethod(String str){
System.out.println("テストメソッド その2");
}
public void testMethod(int a){
System.out.println("テストメソッド その3");
}
public void testMethod(int a, int b){
System.out.println("テストメソッド その4");
}
}
Javaにおいては、このTestクラスをコンパイルするときにtestMethodメソッドを呼び出すための情報が作成されます。そのため、オーバーロードは静的ポリモーフィズムとなります。
動的ポリモーフィズム
動的ポリモーフィズムは、実行時に解決されるポリモーフィズムです。
Javaにおいては、継承がこれに当たります。
例えば、以下のようなコードがあったとします。
class Test {
public void testMethod() {
System.out.println("hogehoge");
}
}
class TestChild extends Test {
@override
public void testMethod() {
System.out.println("fugafuga");
}
}
class Main {
public static void main(String[] args) {
Test test = new TestChild();
test.testMethod();
}
}
TestChildクラスのtestMethodは、親クラスであるTestクラスのtestMethodをオーバーライドしています。
オーバーライドとは、親クラスで定義したメソッドを継承した子クラスで書き換えることです。
上記コードでは、Test test = new TestChild();
というコードを実行することで、親クラスの参照に子クラスが代入されます。そのため、testMethodはTest test = new TestChild();
の実行時に解決されるポリモーフィズムであるため、動的ポリモーフィズムと言えます。