クラスの拡張
クラスを拡張して、より特化した動作を指定できます。
クラス拡張するクラスは、拡張元のクラスのすべてのメソッドとプロパティを継承します。さらに、拡張クラスでは、メソッド定義で override キーワードを使用して既存の仮想メソッドを上書きできます。仮想メソッドを上書きすることで、既存のメソッドの異なる実装方法を使用できます。つまり、特定のメソッドの動作がコールするオブジェクトによって異なることになります。これは「多態性」と呼ばれます。
クラス拡張には、クラス定義で extends キーワードを使用します。クラスは、別のクラスを 1 つまでしか拡張できませんが、複数のインターフェースを実装できます。
次の例では、クラスを拡張する方法を示します。YellowMarker クラスは、Marker クラスを拡張しています。
次のコードセグメントは多態性を示しています。この例では同じデータ型 (Marker) の 2 つのオブジェクトを宣言しています。両方のオブジェクトはマーカーですが、2 番目のオブジェクトは YellowMarker クラスのインスタンスに割り当てられています。そのため、2 番目のオブジェクトで write メソッドをコールすると、このメソッドは上書きされているため、最初のオブジェクトでのこのメソッドのコール結果とは異なります。discount メソッドは YellowMarker クラス定義には含まれていませんが、拡張元のクラスに含まれているため拡張クラス YellowMarker でも使用可能になり、2 番目のオブジェクトでこのメソッドをコールできます。
拡張クラスでは、拡張元のクラスとは共通しない追加のメソッド定義も使用できます。たとえば、次の RedMarker クラスは Marker クラスを拡張し、Marker クラスでは使用できない追加メソッド computePrice が含まれています。この追加メソッドをコールするには、オブジェクトデータ型が拡張クラスである必要があります。
次の例では、RedMarker クラスの追加メソッドをコールする方法を示します。
拡張はインターフェースにも適用され、インターフェースが別のインターフェースを拡張することもできます。クラスでは、インターフェースが別のインターフェースを拡張すると、拡張元のインターフェースのすべてのメソッドとプロパティが拡張先のインターフェースでも利用できます。