本日から、オブジェクト指向言語の特徴であるメタモデル構造のお話をします。
メタモデルは、UMLと言う言語だけが持っていると思われている方がいらっしゃいますが、Javaなどのすべてのオブジェクト指向型言語は、メタモデルを持っています。
UMLが他のオブジェクト指向型言語と異なる点は、UML自身のメタモデルを、UML自身で記述・定義できると言う点にあります。
逆に言いますと、UMLはモデル記述言語として極めて強いパワーを持っていると言えます。
2章 メタモデル構造の理解
2−1メタモデリング
インスタンスと型(タイプ)について
インスタンスと型の関係はファンダメンタル資格試験でも問われる重要な問題であり、UML言語を語る上では絶対にはずせない話題です。
また、従来のコンピュータ言語、例えばJava等でも、根底にはこのインスタンスと型の関係が横たわっています。
さらにまた、メタモデルを理解する上でも、最も基本的な概念となります。ここでは復習の意味もかねて、この関係について考えてみましょう。
まず簡単な例としてデータ型を見てみましょう。実数や整数という型は、どんなコンピュータ言語にも必ずある型です。3.1416とかー2,ー3などはそれらの実例となります。
この実例とデータ型の関係がインスタンスという概念の原型です。
もう少し、見通しの良い言い方をすると、インスタンスと型の関係は、実例と、実例が集まったものとの関係と言うことが出来ます。
実数という型は個々の実数がすべて集まったもの、ストリング(文字列)型とは、様々な文字列がすべて集まったものと言う風に、中学校の数学で習った集合論と極めて似た概念で捉えることが出来ます。
( 注: ただ一点注意しなければならないのは、型は厳密に言うと集合とは異なる集まりの概念です。集合(Set)では、要素の重複が許されないのに対し、型はいくらでも重複が許されます。
こういう集まりを、UMLでは、集合(Set)に対し、コレクション(Collection)と呼んでいます。以下、本書では、特に断らない限りは、集まりはコレクションのことを指し、集合を指す場合は明示的に「集合」という表現をします。)
データ型以外の型として、代表的なものがクラスという概念です。
クラスのインスタンスはオブジェクトです。つまり、クラスはオブジェクトの集まりと捉えることが出来ます。「猫」クラスと言うのは、個々に実在する「ミケ」や「タマ」などの「猫」オブジェクトの集まり概念、「人」クラスとは、「小渕さん」、「森さん」、「小泉さん」など実体、オブジェクトをインスタンスとして持つ集まりの概念です。
サブクラスとスパークラス
サブクラスとスーパークラスの関係も、部分集合(サブセット)の考え方と似ています。「男」クラスと「人」クラスは集合で言う包含関係にあります。つまり、すべての「男」オブジェクトは「男」クラスに属するとともに「人」クラスにも属します。同様に、「人」クラスは「霊長類」クラスに包含されます。別の言い方をすると、「人」クラスは「男」クラスに対しては、スーパークラスであるが、「霊長類」クラスに対してはサブクラスになり、極めて相対的な概念であることがわかります。
抽象クラス
ヒトの集まりである「人」クラス、類人猿の集まりを「類人猿」クラス、猿の集まりを「猿」クラスとし、これら3つのクラスを集めたものを、仮に「霊長類」クラスと呼ぶとしましょう。そうしますと、「霊長類」クラスは他の3つのクラスの共通のスーパークラスとなります。
そして、「霊長類」クラスに属するインスタンス、オブジェクトは、必ず何れかのサブクラスに属することになります。この「霊長類」クラスのように、すべてのインスタンスが必ずどれかのサブクラスのインスタンスになってしまうもの、つまり間接的にしかインスタンスを持ち得ないクラスを抽象クラスと呼びます。
また、たとえ一つであっても直接インスタンスを持つ場合は、抽象クラスとは呼びません。なお、抽象クラスとは反対に、直接インスタンスを持ちうるクラスのことを具象クラスと呼びます。