プログラミング言語論10

プログラミング言語論
第十回
理工学部
情報システム工学科
新田直也
オブジェクト指向の考え方

プログラムをオブジェクトの塊と見る.



C言語: プログラムを関数(手続き)の塊と見る.
関数型言語: プログラムを(数学的な)関数の塊と見る.
人工知能型言語: プログラムを知識(論理式)の塊と見る.
オブジェクト
メッセージ
オブジェクトとメッセージ



オブジェクト同士はメッセージで互いに情報をやり取りする.
オブジェクトはお互いに相手の中身を知らない.
オブジェクトの型をクラスという.
クラス
Javaによるオブジェクト指向
(クラス)

クラスは,メンバ変数とメソッドをカプセル化したもの.

例:
class Vector {
double x;
double y;
Vector add(Vector a) {
x += a.x;
y += a.y;
return this;
}
double inner_product(Vector a) {
return x * a.x + y * a.y;
}
double length() {
return Math.sqrt(inner_product(this));
}
}
メンバ変数
メソッド
Javaによるオブジェクト指向
(インスタンス)
オブジェクトはインスタンスとして表現される.
 インスタンスは new によって生成される.



構文: new クラス名()
例:
class Test {
public static void main(String args[]) {
Vector a, b;
参照型変数(後で説明)
a = new Vector();
b = new Vector();
}
Vectorのインスタンスの生成
}
Javaによるオブジェクト指向
(メッセージ)

メッセージの送信はメソッド呼出しに対応する.


構文: インスタンス名.メソッド名(実引数1, 実引数2, …)
例:
class Test {
public static void main(String args[]) {
Vector a, b;
double d;
a = new Vector();
b = new Vector();
a.x = 5;
a.y = 10;
a の inner_product() を呼出し
b.x = 15;
b.y = 20;
d = a.inner_product(b);
System.out.println(d);
}
}
Javaによるオブジェクト指向
(コンストラクタ)

インスタンスの生成も実はメソッド呼出し.
コンストラクタ: インスタンスを生成するメソッド(引数を持てる).
 例:
class Vector {
:
Vector(double px, double py) {
x = px;
クラスと
コンストラクタ
y = py;
同一名
}
:
}
class Test {
public static void main(String args[]) {
Vector a, b;
double d;
a = new Vector(5, 10);
b = new Vector(15, 20);
:

Javaによるオブジェクト指向
(変数宣言)

変数には基本型と参照型がある.



基本型: int, double, float, long, boolean
参照型: 配列型,クラス型
宣言は使用前ならどこでも可能
a
Vector
class Test {
b
public static void main(String args[]) {
参照型
Vector a = new Vector(5, 10);
Vector b = a;
a の内容を b の内容に
double d = a.length();
コピーするわけではない.
基本型
System.out.println(d);
b が a と同じオブジェクト
b.x = 10;
を指すようになる.
d = a.length();
System.out.println(d);
a.x の値も同時に変わる.
}
}
Javaによるオブジェクト指向
(this演算子)

this演算子: 自分自身を参照する演算子.

例:
class Vector {
double x;
double y;
Vector add(Vector a) {
x += a.x;
this.x
+= a.x;
y += a.y;
this.y
+= a.y;
return this;
}
double inner_product(Vector a) {
return x
this.x
* a.x* +
a.x
y*
+ a.y;
this.y * a.y;
}
double length() {
return Math.sqrt(this.inner_product(this));
Math.sqrt(inner_product(this));
}
}
継承

継承:
基本となるクラスを拡張して,新しいクラスを定義すること.

親クラス:
元となるクラス.スーパークラスとも言う.

子クラス:
親クラスを拡張したクラス.拡張した部分だけ定義する.
基底クラス
クラスA
派生
クラスC
派生
クラスB
派生
クラスD