見出し画像

ポリモーフィズムについて

ポリモーフィズムとは

ポリモーフィズムとは、オブジェクト指向プログラミングの概念の1つであり、同じインターフェースを持つ異なるクラスやオブジェクトが異なる振る舞いをすることを可能にする特性です。この概念は、異なるオブジェクトやクラスが同じメソッド名を持ち、それぞれがそれに対して異なる実装を持っているときに発揮されます。

※インターフェースについてはこちらになります。
↓           ↓           ↓              

Javaでの実装例

ポリモーフィズムの2つの主要な形態で静的ポリモーフィズムと動的ポリモーフィズムがあります。

■静的ポリモーフィズム
静的ポリモーフィズムは、コンパイル時に決定されるポリモーフィズムの形式です。主にメソッドのオーバーロード(メソッドのシグネチャが異なる場合)や、コンパイル時に静的な型に基づいて解決される方法です。

例えば、同じメソッド名を持つが引数の型や個数が異なる複数のメソッドを定義することができます。コンパイル時には、引数の型や個数に基づいてどのメソッドが呼び出されるかが解決されます。これにより、静的型言語でコンパイル時の型チェックが可能になります。

以下がソース例になります。
↓           ↓           ↓

abstract class Shape {
    abstract double area();
}

class Rectangle extends Shape {
    private double width;
    private double height;

    Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    double area() {
        return width * height;
    }
}

class Circle extends Shape {
    private double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double area() {
        return Math.PI * radius * radius;
    }
}

public class Main {
    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle(5, 4);
        System.out.println("Rectangle Area: " + rectangle.area());

        Circle circle = new Circle(3);
        System.out.println("Circle Area: " + circle.area());
    }
}

■動的ポリモーフィズム
動的ポリモーフィズムは、実行時に解決されるポリモーフィズムの形式です。主にメソッドのオーバーライド(継承されたメソッドが子クラスによって再定義される場合)や、実行時のオブジェクトの型に基づいてメソッドが呼び出される方法です。

例えば、同じメソッド名を持つが子クラスで再定義されたメソッドがある場合、実行時にはオブジェクトの実際の型に基づいてどのメソッドが呼び出されるかが解決されます。これにより、実行時に動的な振る舞いを実現できます。

以下がソース例になります。
↓           ↓           ↓

abstract class Animal {
    abstract String speak();
}

class Dog extends Animal {
    @Override
    String speak() {
        return "Woof!";
    }
}

class Cat extends Animal {
    @Override
    String speak() {
        return "Meow!";
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        System.out.println("Dog says: " + dog.speak());

        Animal cat = new Cat();
        System.out.println("Cat says: " + cat.speak());
    }
}

ポリモーフィズムの利点

以下に内容がポリモーフィズムの利点になります。

柔軟性と拡張性: ポリモーフィズムにより、同じインターフェースを持つ異なるクラスやオブジェクトが異なる振る舞いをすることができます。これにより、コードの柔軟性が向上し、新しいクラスやオブジェクトを追加しても既存のコードに影響を与えることなく、システムを拡張することができます。

再利用性: ポリモーフィズムを使用すると、同じインターフェースを持つ複数のクラスやオブジェクトが異なる実装を持つことができます。これにより、コードの再利用性が向上し、同じインターフェースを持つ異なるクラスやオブジェクトで共通の処理を実行することができます。

保守性: ポリモーフィズムを使用すると、コードの変更が容易になります。例えば、新しいクラスを追加したり、既存のクラスの振る舞いを変更したりする場合でも、変更がインターフェースに対して行われる場合は、影響を受けるクラスが少なく、保守性が高まります。

可読性: ポリモーフィズムを使用すると、同じインターフェースを持つ異なるクラスやオブジェクトが共通のメソッドを持つことができます。これにより、コードがより簡潔で可読性が高くなります。また、インターフェースや抽象クラスを使用することで、コードの意図が明確になり、他の開発者がコードを理解しやすくなります。

ポリモーフィズムの注意点

以下に内容がポリモーフィズムを使う上での注意する点になります。

過度の使用: ポリモーフィズムを過度に使用すると、コードの理解やメンテナンスが難しくなる場合があります。適切なタイミングと場面でのみポリモーフィズムを使用することが重要です。特に、静的ポリモーフィズムのオーバーロードを過度に使用すると、コードの読みやすさが低下し、開発者が意図したメソッドが呼び出されるかどうかを理解するのが難しくなります。

実行時のパフォーマンス影響: 動的ポリモーフィズムは実行時に解決されるため、実行時のパフォーマンスに影響を与える場合があります。特に、動的な型変換やメソッドの呼び出しが多い場合に、パフォーマンスの低下が発生する可能性があります。このため、パフォーマンスが重要なアプリケーションでは、ポリモーフィズムの使用に注意が必要です。

オーバーライドの意図の不明確さ: オーバーライドされたメソッドの振る舞いが親クラスと異なる場合、その意図が明確でないと理解される可能性があります。特に、継承関係が深い場合や大規模なコードベースの場合に、オーバーライドの意図を理解することが難しくなります。そのため、オーバーライドを行う際には、十分なコメントやドキュメントを残すことが重要です。

誤った実装: ポリモーフィズムを誤った方法で実装すると、意図しない動作やバグを引き起こす可能性があります。特に、メソッドのオーバーライドやオーバーロードを行う際には、意図した振る舞いを十分にテストして確認することが重要です。また、適切なデザインパターンやベストプラクティスに従うことも重要です。

最後に

ポリモーフィズムを使うことで保守性や実装がより良くなるものですが適切に実装する必要がありますね。
今回はここまでとなります。最後まで閲覧いただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?