オブジェクト指向言語論11

オブジェクト指向言語論
第十一回
知能情報学部
新田直也
抽象クラス,抽象メソッド


抽象メソッド:
実体を持たないメソッド.abstract 修飾子を付ける.
メソッドの実装は派生クラスに任せる.
抽象クラス:
抽象メソッドを1つ以上持つクラス.抽象クラスはインスタンス化
できない.(継承しなければ使えない.)
abstract class Shape {
// 抽象図形クラス
abstract void view(Graphics g); // 抽象表示メソッド
}
→ Shape クラスはインスタンス化できない.
インタフェースと抽象クラス

インタフェース:
メンバ変数を持たないクラスの一種.メソッドはすべて抽象メ
ソッドで,抽象クラス同様,インスタンス化できない.

実装:
各クラスは,継承ではなく実装(implements)を用いてイン
タフェースを利用する.Javaでは複数のクラスを同時に継承
すること(多重継承)は許されていないが,複数のインタ
フェースを同時に実装することは許されている.

抽象クラスとの違い:


抽象クラス
→ クラスの未完成品,汎化されたクラス
インタフェース → 会話するための約束事,付加的な機能
インタフェースの使用例

マウスイベントの監視インタフェース
public interface MouseListener extends EventListener {
public void mouseClicked(MouseEvent e);
public void mousePressed(MouseEvent e);
public void mouseReleased(MouseEvent e);
public void mouseEntered(MouseEvent e);
public void mouseExited(MouseEvent e);
}
abstract class Shape implements MouseListener {
:
public void mouseClicked(MouseEvent e) {
// マウスクリックされたときの処理
}
}
オブジェクト指向(Java)プログラミ
ングにおける注意点

クラスは型である.



クラスは参照型である.




int, double, float などとほぼ同様に扱うことができる.
C言語では,構造体も型であった.
参照型はポインタ(アドレスが入る)と考えればよい.
基本型:int, double, floatなど値を持つもの.
参照型:クラス,配列など.
クラスとインスタンスの概念を混同しないこと.
戻り値としてのオブジェクト

オブジェクト(インスタンス)は戻り値として返すこと
ができる.
public class Main {
public class A {
main() {
public B createB() {
A a = new A();
B b = new B();
B b1 = a.createB();
return b;
}
}
}
}
public class B {
}
引数としてのオブジェクト

オブジェクト(インスタンス)は引数として渡すことが
できる.
public class Main {
main() {
A a = new A();
B b1 = new B();
a.setB(b1);
}
}
public class A {
B b = null;
public void setB(B arg) {
b = arg;
}
}
public class B {
}
Setter と getter

一般にオブジェクトを設定するメソッドを setter,取
得するメソッドを getter という.
public class Main {
main() {
A a = new A();
B b1 = new B();
a.setB(b1);
B b2 = a.getB();
}
}
b1と同じオブジェクト
が入っている
public class A {
B b = null;
public void setB(B arg) {
b = arg;
}
public B getB() {
return b;
}
}
public class B {
}
クラスとインスタンスの区別につい
て(1/3)

クラスとインスタンスを概念的に
混同しないように注意すること.
public class Main {
main() {
A a1 = new A();
A a2 = new A();
a1.setN(1);
a2.setN(2)
int n = a1.getN();
}
1が入っている
}
a1
n
1
a2
n
2
Aのインスタンス
毎に値が異なる
public class A {
int n = 0;
public void setN(int i) {
n = i;
}
2回呼び出
public int getN() { されるがイ
return n;
ンスタンス
}
が異なる
}
クラスとインスタンスの区別につい
て(2/3)

クラスとインスタンスを概念的に
混同しないように注意すること.
public class Main {
main() {
A a1 = new A();
A a2 = new A();
B b1 = new B();
B b2 = new B();
a1.setB(b2);
a2.setB(b1);
B b3 = a1.getB();
}
b2と同じインスタンス
が入っている
}
a1
b
b2
a2
b
b1
public class A {
B b = null;
public void setB(B arg) {
b = arg;
}
public B getB() {
return b;
}
}
public class B {
}
クラスとインスタンスの区別につい
て(3/3)

クラスは参照型であるため,クラス型
の変数にはアドレスが入っている.
public class Main {
main() {
A a1 = new A();
A a2 = new A();
B b1 = new B();
a1.setB(b1);
B b2 = a1.getB();
a2.setB(b2);
B b3 = a2.getB();
}
b1と同じインスタンス
が入っている
}
a1
b
a2
b
b1
public class A {
B b = null;
public void setB(B arg) {
b = arg;
}
public B getB() {
return b;
}
}
public class B {
}
まとめ

プログラムの動きは完全に論理的に説明できる.


プログラミング言語のさまざまな仕組みは工学的理由があっ
て導入されている.


プログラミングについて苦手意識を持つ前に,最初は時間がか
かってもいいので,まずはプログラムの動きを1行ずつ丁寧に
追いかけて理解するようにすること.
オブジェクト指向言語を使う主な理由は,再利用性,拡張性,
読み易さなどである.チームでプログラミングする上で書き易さ
はさほど重要ではない.
オブジェクト指向言語を使ってもプログラムが複雑になる場
合がある.

ソフトウェアという人工構造物が本質的に複雑であるため.(詳しくは
来年度のソフトウェア工学で説明.)