オブジェクト指向 | 基礎用語のまとめ(順次追加中)
オブジェクトという用語は時に「もの」という直訳語で認識されることが多く、 実際には、「もの」、あるいは「対象物」と表現されることもあります。 オブジェクト指向は、機能、データを一つの対象物としてとらえ、
把握する考え方を推し進めたものといえると思います。 UMLは、このオブジェクト指向を表記するためのものです。
オブジェクトとは
オブジェクトは、それ自身の属性(プロパティ)と操作(メソッド、オペレーション・能力)を持っています。
オブジェクト間のメッセージ
オブジェクトは1つ1つは独立してしています。このようなオブジェクトは、 メッセージを通して、それぞれの役割を果たし、その結果、全体として仕事が成立していくことになります。
メッセージパッシング
あるオブジェクトから別のオブジェクトの操作(メソッド)を実行する場合、別のオブジェクト に操作を依頼していると考えます。メソッドの呼び出しは、実行するオブジェクトへのメッセージ
送信であり、オブジェクトに要求を行う唯一の手段となります。このことをメッセージパッシングと呼びます。
アクティブオブジェクト
オブジェクト内にスレッドを内蔵し、自立して能動的に動作するオブジェクトです。
パッシブオブジェクト
例外はあるかもしれませんが、一般的に、アクティブオブジェクト以外は、すべてパッシブオブジェクトとなります。
メッセージ同期
呼び出し側は、戻り値が帰ってくるまで処理を待ちます。
メッセージ非同期(シグナル)
呼び出し側が処理の完了を待たされずに、 呼び出した処理が行われるメッセージです
クラスとオブジェクトとインスタンス
クラス
オブジェクトの構造と、操作(振る舞い)を定義します。
オブジェクト
クラスはオブジェクトの設計図と表現してよいと思います。オブジェクトは、実体、具体(具象)例などと呼ばれ クラスから生成された場合、個々の実体を識別できるものになっております。
インスタンス
クラスからオブジェクトを作ることをインスタンスを生成するといいます。
一般的に、ひとつのクラスから複数のオブジェクトを生成できますが、この場合、メソッドなどコードはメモリー内で 共有されておりますが、データの部分(属性)は別領域(ヒープ)に確保されます。
抽象クラス
インスタンス化されないクラスで、観念的なクラスといえます。メソッド、プロパティなどの実装はなくメンバの宣言のみ記述します。 派生クラスのほうで、これらのメソッド、プロパティの実装することになります。
分類子 | UML
インスタンスを持つことができる要素です。クラス、インターフェースなどだけでなく、関連は関係のインスタンス であることから関連も分類子に属します。
関係、特性
特性
特性とは、分類子の性格をあらわすためのものです。
|
- 特性
- 構造特性
- 属性(プロパティ)
↓
- インスタンスの構造をあらわすためのもの
- 振る舞い特性
- オペレーション(メソッド)
↓
- インスタンスの振る舞いをあらわすためのもの
|
|
クラス図 |
特性説明 |
カプセル化
オブジェクト内の仕様や構造を外部から隠蔽することで、オブジェクトの独立性を高めることです。
オブジェクトの独立性の向上は、オブジェクト内部の仕様変更が外部に影響しにくくなり、 ソフトウェアの保守性や開発効率はアップし、結果、プログラムの部分的な再利用が容易なるのです。
継承(汎化)、インターフェース
継承(汎化)
あるクラスの特性を引き継ぎ、新たなクラスを作ることです。
元になったクラスは「スーパークラス」「基本(基底)クラス」と呼ばれ、継承して作られたクラスの方は「派生クラス」といいます。
属性や操作(メソッド)などが引き継がれます。
インターフェース
広義の意味でインターフェースは、プログラム間でデータをやり取りする手順や形式を定めたものですが 、オブジェクト指向についてのインターフェースは意味的に違いが出てきます。
Java,C#などの言語レベルのインターフェースとは、メソッドあるいは属性(プロパティ)などのシグネチャ(メソッドの型)の集合です。
インターフェースは型の定義の集合であり、クラスの設計の契約となりうるものです。しかし、実装については、 記述するすることないため、インターフェースを直接インスタンス化してオブジェクトを作ることはできません。
実装を求めるには、これらインターフェースを継承した派生クラスで再定義する必要があります。
シグネチャ
メソッド名、引数の型や引数の数を表現する型です。(ちなみに、戻り値はシグネチャに含まれません。)
多様性(ポリモーフィズム)
同一のインタフェースに対して 異なる実装を持つ複数のオブジェクトがオブジェクトごとに異なる振る舞いをすることです。
多様性 C#サンプルソースコード
|
Polymorphism サンプルコード
|
|
using System;
namespace polymorphism
{
interface
IloveMessage
{
string
getMessage();
}
abstract
class Person : IloveMessage
{
abstract
public string getMessage();
}
class
Taro : Person
{
public
override string getMessage()
{
return
"大好きです。";
}
}
class Bob
: Person
{
public
override string getMessage()
{
return
"I Love You.";
}
}
class Hanako
: Person
{
public
override string getMessage()
{
return
"おらと結婚してくだせえ。";
}
}
class Polymorphism_Sample
{
[STAThread]
static
void Main(string[] args)
{
Person A
=new Taro();
Person B
=new
Bob();
Person C
=new Hanako();
Console.WriteLine(A.getMessage());
Console.WriteLine(B.getMessage());
Console.WriteLine(C.getMessage());
}
}
}
|
|
実行結果
|
|
多様性 Javaサンプルソースコード
|
IloveMessage.java
|
/* * インターフェースを定義 * 愛の告白(笑) * */
public interface IloveMessage {
String getMessage();
}
|
|
Person.java
|
/* * Personクラスを定義(抽象クラス) * 愛の告白インターフェースを継承 * */
public abstract class Person implements IloveMessage{
}
|
|
Taro.java
|
/* * 太郎(日本男性で定義) */
public class Taro extends Person{
public String getMessage(){
return "大好きです。";
}
}
|
|
Bob.java
|
/* * Bob(米国男性)で定義 * */
public class Bob extends Person{
public String getMessage(){
return "I Love You.";
}
}
|
|
Hanako.java
|
/* * 花子(女性)で定義 * */
public class Hanako extends Person {
public String getMessage(){
return "おらと結婚してくだせえ。";
}
}
|
|
StartClass.java
|
public class StartClass {
/** * @param args */
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Person A = new Taro();
Person B = new Bob();
Person C = new Hanako();
//同じクラス(Person)ですが振る舞いが異なります。
System.out.println(A.getMessage());
System.out.println(B.getMessage());
System.out.println(C.getMessage());
}
}
|
|
実行結果
|
 |
オーバーライド
上記の多様性のサンプル例もそうですが、継承を使用する場合に、基本クラスのメソッドを 派生クラス側で書き直す(書き足す)こと。メソッドを『再定義』することをオーバーライドと呼びます。
オーバーライドを前提としている場合、基本クラスのメソッドを抽象化しておく(実装を記述しない)ことで、 基本クラスからのメソッドの実行をさせないようにすることが考えられます。C#,Javaなどの言語は、
抽象メソッドを使用するクラスは、抽象クラスで記述することになっており、抽象メソッド を持った不完全なクラスがインスタンス化されない仕組みになっています。
アーリーバインディングとレイトバインディング
基本クラスと派生クラスに同じメソッドがある場合、実行時に動的に呼び出されたメソッドを実行するのが 望ましいとされております。Javaでは実行時のインスタンスにあわせたメソッドが自動的に呼び出されるように
なっています(レイトバインディング)が、C#では、コンパイル実行前の静的な呼び出しが呼び出される仕様 となっています(アーリーバインディング)。
C#でオーバーライドを行う場合、メソッドへvirtual,overrideという修飾子を基本クラスと
派生クラスのメソッドに明記します。
UMLインデックスへ
Homeへもどる
|