Main Content

クラスの階層 — 概念

分類

クラスを階層化すると、コードに加え、既に解決済みの設計問題の解も再利用しやすくなります。クラスの階層はセットとみなすことができます。このセットは、スーパーセット ("スーパークラス" または "基底クラス") とサブセット ("サブクラス" または "派生クラス") から成ります。次の図は、クラスを使用して従業員のデータベースを表す方法を例として示しています。

Venn diagram and class diagram showing employee categories

階層のルートは Employees クラスです。このクラスは、すべての従業員のセットに適用するデータと操作を含みます。従業員のセットにはサブセットが含まれます。サブセットのメンバーは従業員でもありますが、従業員のタイプをさらに特定して定義するセットのメンバーでもあります。TestEngineer のようなサブクラスは、これらのサブセットの例です。

抽象化の進展

クラスは、現実の世界の概念または物事を表現します。クラスを設計する際には、クラスが表現するものを抽象化します。従業員の抽象化と、クラスの利用目的に対して従業員の本質的な面は何かを考えてください。たとえば、住所、氏名、部門は、すべての従業員がもっているものです。

クラスを設計するときは、抽象化にはこれらの必要な要素のみを含めます。たとえば、従業員の髪の色や靴のサイズも特長には違いありませんが、この従業員クラスの設計には関係がないといえるでしょう。一方、販売担当地域は、一部の従業員だけに関係するので、サブクラスに属します。

クラス階層の設計

クラスのシステムを設計する際には、共通のデータと機能をスーパークラスに配置します。このスーパークラスから、サブクラスを派生します。サブクラスは、スーパークラスのデータや機能を継承し、特定の目的に応じたサブクラスに固有の特徴のみを定義します。この方法には、次のような利点があります。

  • すべてのクラスに共通するコードの重複を避けられる。

  • スーパークラスを変更せず、さらに他のサブクラスに影響を与えずに、いつでもサブクラスの追加や変更ができる。

  • スーパークラスが変更される (たとえば、全従業員に従業員番号が割り当てられた場合など) と、サブクラスも同様に変更される。

スーパークラスとサブクラスの動作

サブクラスのオブジェクトは、スーパークラスを特殊化したものであるので、スーパークラスのオブジェクトと同様に動作します。このことにより、同じように動作する関連するクラスの開発は容易になりますが、実装は異なります。

スーパークラス オブジェクトとサブクラス オブジェクトの Is-A 関係

サブクラスのオブジェクトとそのスーパークラスのオブジェクトとの関係は、通常、以下のようなステートメントを使用して説明することができます。

The subclass is a superclass (そのサブクラスはスーパークラスの一種です)以下に例を示します。技術者 Is A 従業員 (技術者は従業員の一人です)。

この関係は、サブクラスに属するオブジェクトはそのスーパークラスと同じプロパティ、メソッドおよびイベントをもつことを暗示するものです。また、サブクラス オブジェクトはそのサブクラスで定義される新しい機能ももちます。この関係を関数 isa を使ってテストします。

サブクラスのオブジェクトをスーパー クラスのオブジェクトのように取り扱う

サブクラスのオブジェクトをスーパークラスのメソッドに渡すことはできますが、アクセスできるのはスーパークラスで定義されているプロパティだけです。この動作により、スーパークラスに影響を与えずにサブクラスを変更できます。

スーパークラスとサブクラスの動作について、次の 2 点を覚えておく必要があります。

  • スーパークラスで定義されているメソッドは、サブクラス オブジェクト上で使用可能

  • サブクラスで定義されているメソッドは、スーパークラス オブジェクト上で使用不可能

したがって、その他の Employee オブジェクトのように Engineer オブジェクトを取り扱うことができますが、Employees オブジェクトを Engineer オブジェクトに渡すことはできません。

オブジェクト代替の制限

MATLAB® では、そのオブジェクトの最も特定的なクラスに基づいてオブジェクトのクラスを判定します。したがって、Engineer オブジェクトは、class Engineer である一方、関数 isa を使用するとわかるように、これは Employees オブジェクトでもあります。

通常、MATLAB では、配列は 1 つのクラスのみに属していなければならないため、スーパークラス オブジェクトとサブクラス オブジェクトが混在した配列の作成はできません。クラスが異なるオブジェクト同士を連結しようとする場合、MATLAB は、より低優先度のクラスによって定義されるコンバーター メソッドを検索します。

詳細は、異なるクラスのオブジェクトの連結を参照してください。

異種混合クラス階層の詳細については、「matlab.mixin.Heterogeneous」を参照してください。

コンバーター メソッドの定義方法の詳細は、オブジェクト コンバーターを参照してください。

実装とインターフェイスの継承

MATLAB クラスは、スーパークラスから実装されたメソッドの継承、スーパークラスの抽象メソッドで定義されたインターフェイスの継承をサポートします。

継承の実装により、サブクラスはコードを再利用できます。たとえば、employee クラスは、すべての employee サブクラスが使用できる submitStatus メソッドをもつことができます。サブクラスは、一般的な面を再利用しながら特化した機能を提供するように継承メソッドを拡張できます。この過程の詳細は、継承メソッドの変更を参照してください。

インターフェイスの継承は以下の場合に便利です。

  • 複数クラスへの同一インターフェイスの指定。

  • サブクラスによる、メソッドとプロパティの限定的実装の作成。

抽象クラスをスーパークラスとして使用して、インターフェイスを作成します。このクラスは、サブクラスで実装しなければならないメソッドとプロパティを定義しますが、実装は与えません。

サブクラスでは、スーパークラスの抽象メンバーの独自の実装を与えなければなりません。インターフェイスを作成するには、Abstract 属性を使用してメソッドとプロパティを abstract として定義します。詳細と例は、抽象クラスとクラス メンバーを参照してください。

関連するトピック