内 Ⅹ. インターフェースと 多重継承 容 単一継承と多重継承 多重継承の例:色付き図形 多重継承の問題点 インタ フ インターフェースとは スとは インターフェースの定義法 インターフェースの実現 例題:色付き図形 1 単一継承と多重継承 単一継承と多重継承 単一継承と多重継承(スーパークラスの数と継承関係) 単一継承 2 特徴 直接のスーパークラスは1個しか持つことができない 多重継承 単一継承 直接のスーパークラスとして2個以上のクラスを持つこと ができる 多重継承 多重継承 単一継承 クラス階層はツリー構造 クラス階層の構造はシンプルであり理解しやすい スーパークラスの数が制限されているため柔軟性にかけ ス パ クラスの数が制限されているため柔軟性にかけ る クラス階層はネットワーク クラス階層の構造が複雑であり様々な問題が発生する可 能性がある スーパークラスの数に制限がないために様々なクラス階 層構造を実現できる 3 多重継承の例:色付き図形 Javaは複雑さを回避するために多重継承は許していない C++では多重継承を許しているため複雑になっている 多重継承の例:色付き図形(図形と色を別々なクラスで定義する) 4 多重継承の問題点 多重継承の問題点 図形 色 RectFigure OvalFigure 多重継承 多重継承 ColoredOval クラス階層構造が複雑になり様々な問題が出てくる 単一継承の場合クラス階層構造がツリー構造というシン プルで理論的にも扱いやすい構造になるため問題点も少 class A { ない private int x; 問題点 A public int f() { ・・・ } } class B extends A { public int f() { ・・・ }} B C class C extends A { public int f() { ・・・ }} class D extends B, C { D ・・・ } Figure Colorable Javaで多重継承を用いない理由 ColoredRect Javaでは許されない継承関係 5 6 多重継承の問題点 多重継承の問題点 メソッドに関する問題点 d.xが2つ存在する 「d.x」と書いたとき どちらのフィールド を示すか決定でき なくなる フィールドに関する問題点 D d = new D(); System.out.println(d.x); x f()はクラスB,Cでオーバライドされたものとする クラスA x 多重継承の問題点 インターフェースとは この場合d.f()はクラスBのメソッドfを指すのかクラスCの この場合d f()はクラスBのメソッドfを指すのかクラスCの メソッドfを指すのか特定できない このような場合は、クラスDで再度メソッドfを定義しなお すことになる このように多重継承を許した場合、単一継承になかった 様々な問題が生じてくる。これらの問題を解決する手段 は存在するが、あまり美しくなかったり、きわめて複雑な ものになりやすい Javaが多重継承を許さないのはこのような点を嫌ったた めである 多重継承で問題が発生したのは、スーパークラスでオブ ジェクトのフィールド定義やメソッド本体の定義が行われ たことが原因 ス パ クラスにおいてフィ ルド定義とメソ ド定義をな スーパークラスにおいてフィールド定義とメソッド定義をな くしたものがJavaのインターフェースである。すなわち フィールドを書かず、メソッドは宣言だけをする 9 インターフェース インターフェースの定義法 書式 interface インターフェース名 { メソッド宣言 ・・・ } 例 interface Point { public void move(int dx, int dy); } Pointという名前のインターフェースの定義 moveメソッドが1個だけ宣言されている インターフェースの中で宣言されるすべてのメソッドは 抽象メソッドなので、メソッド本体は書かない 11 8 インターフェース D d = new D(); d.f(); クラスC D d = new D(); d.f(); メソッドに関する問題点 f() クラスC 7 クラスB クラスD クラスB クラスD クラスA f() 10 インターフェース インターフェースの実装 インターフェースは抽象クラスをスーパークラスとするクラス 定義に似ている クラス定義の場合スーパークラスの前に「extends」と書く インターフェースの場合は「implements」と書く 例 class MyPoint implements Point { public MyPoint(int vx, int vy) { ・・・ } public void move(int dx, int dy) {メソッド本体} } PointインタフェースをベースにしてMyPointというクラスの定義 インターフェースで宣言された抽象メソッドmoveの本体を定義 してやる必要がある インターフェースで宣言された抽象メソッドが複数ある場合は, すべてのメソッド本体を定義する必要がある 12 例題:色付き図形 クラス階層図 <<interface>> Colorable setColor(Color vc) getColor() ColoredOval <<interface>> Figure 例題:色付き図形 draw(Graphics g) move(int dx, int dy) プログラム import java.awt.*; OvalFigure interface Colorable { public void setColor(Color vc); public Color getColor(); } int x, y, width, height OvalFigure(int vx vx, int vy, int vw, int vh) draw(Graphics g) move(int dx, int dy) interface Figure { public void draw(Graphics g); public void move(int dx, int dy); } // 次ページへ続く Color c ColoredOval(int vx, int vy, int vw, int vh, Color vc) draw(Graphics g) setColor(Color vc) getColor() 例題:色付き図形 例題:色付き図形 class OvalFigure implements Figure { private int x, y; private int width, height; public OvalFigure(int vx, int vy, int vw, int vh) { x = vx; y = vy; width = vw; height = vh; } public void draw(Graphics g) { g.drawOval(x, y, width, height); } public void move(int dx, int dy) { x = x + dx; y = y + dy; } } // 次ページに続く 14 13 class ColoredOval extends OvalFigure implements Colorable { private Color c; public ColoredOval(int vx, int vy, int vw, int vh, Color vc) { super(vx, vy, vw, vh); c = vc; } // 次ページに続く 15 16 例題:色付き図形 例題:色付き図形 import java.awt.*; import java.applet.Applet; public void draw(Graphics g) { g.setColor(c); super.draw(g); } public class InterfaceTest extends Applet { public void paint(Graphics g) { ColoredOval co = new ColoredOval(10, 10, 80, 60, Color red); Color.red); public void setColor(Color vc) { c = vc; } public Color getColor(){ return c; } for(int i = 0; i < 20; i++) { co.draw(g); co.move(5, 5); } } } } 17 18 例題:色付き図形 例題:色付き図形 Colorable, Figureという2個のインターフェースを定義 インターフェースなのでメソッド(本体の定義なし)の宣言 だけが行われ、フィールドは定義されない OvalFigureは、Figureインタフェースを実装した楕円を表 すクラス C l dO lはO lFi ColoredOvalはOvalFigureをスーパークラスに持つと同 をス パ クラスに持つと同 時にColorableインタフェースを実装 スーパークラスにできるクラスは1個だが、インターフェー スは何個でも置くことができる このようにして多重継承と同等でシンプルなクラス階層構 造を実現できる 実行結果 19 演習問題9(1) まとめ インターフェースと抽象クラスは似ている インターフェースも抽象クラスと同様に柔軟なクラス 階層を作る上で必要となってくる インターフェースと抽象クラスの違い ① 単一継承と多重継承の違いを図を用いて 説明せよ。 インターフェースは1つのクラスに対して複数個実装(継承も インタ フ スは1つのクラスに対して複数個実装(継承も どき)できるが、抽象クラスは1個だけしか継承できない インターフェースは、全てのメソッドを宣言するのみである が、抽象クラスは宣言するのみの抽象メソッドと中身の処 理を定義する一般のメソッドが混在している インターフェースはフィールドを定義しないが、抽象クラスは フィールドを定義する 21 演習問題9(2) 20 例のプログラムを参考にして、色つきの長方形 を表すクラスおよびインターフェースを定義せよ。 インターフェースとしてFigureとColorable、クラ スとしてRectFigureおよびColoredRectを書くこ と。 23 ② 多重継承の問題点は何か簡潔にまとめよ。 多重継承の問題点は何か簡潔にまとめよ 22
© Copyright 2024 ExpyDoc