Ⅹ. インターフェースと 多重継承

内
Ⅹ. インターフェースと
多重継承
容







単一継承と多重継承
多重継承の例:色付き図形
多重継承の問題点
インタ フ
インターフェースとは
スとは
インターフェースの定義法
インターフェースの実現
例題:色付き図形
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