オブジェクト指向言語論 第十一回 知能情報学部 新田直也 抽象クラス,抽象メソッド 抽象メソッド: 実体を持たないメソッド.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行ずつ丁寧に 追いかけて理解するようにすること. オブジェクト指向言語を使う主な理由は,再利用性,拡張性, 読み易さなどである.チームでプログラミングする上で書き易さ はさほど重要ではない. オブジェクト指向言語を使ってもプログラムが複雑になる場 合がある. ソフトウェアという人工構造物が本質的に複雑であるため.(詳しくは 来年度のソフトウェア工学で説明.)
© Copyright 2024 ExpyDoc