復習(クラスと継承)
用語の復習
- クラス(class)
- オブジェクトを作るための設計図のようなもの。ただし、講義の最初の方で作ったような、
mainメソッドしか含まないクラスや、
java.lang.Mathクラスのように、クラスに対応するオブジェクトが作られないクラス
もある。これは、Java言語はプログラムをクラスの集合と定義しているため、すべてのメソッド
や定数はいずれかのクラスに含む必要があるので、やむをえず(設計者はこの方が良いと積極的に思っていると思うが)このようにしている。
- オブジェクト(object)
- データを保持して(インスタンス変数に)、それに対する操作(動的メソッド)を
提供する実体。Java言語ではすべてのオブジェクトはいずれかのクラスを設計図として
作られる。あるクラスのインスタンスであるとも言う。
- 継承(inheritance)
- あるクラスを雛型にして、機能を付け加えた(それに伴って保持するイン
スタンス変数も増えた)派生クラスを作成すること。オブジェクト指向言語では、イ
ンタフェースの継承(メソッド等を同じように呼び出せる)とそれに加えて実装の継承(
雛型としたクラスにおけるメソッド定義がそのまま派生したクラスで有効になる)の
区別があるが、Java言語では前者だけを実現する interface と、後者も実現する
継承とを使い分けている。
- 親クラス、スーパークラス
- クラスの継承をおこなう際の雛型とするクラス。
- 子クラス、サブクラス
- クラスの継承をおこなう際に派生したクラス。Java言語では子クラスは
1つの親クラスからしか継承をおこなえない(単一継承 single inheritance)という
特徴がある。
- 委譲(delegation)
- あるオブジェクトの持つ機能を拡張したオブジェクトが欲しい時に、継承を使わずに
そのオブジェクトを内部に(インスタンス変数として)含むようなオブジェクトを作成して、
その機能の実装は、内部に持つオブジェクトにたらい回しにする方法も考えられる。これを
委譲(delegation)と言い、クラスのない言語でオブジェクト指向を実現するのに使われる。
- クラスメソッド(static method)
- そのクラスには関連を持つが、そのクラスの特定のインスタンスには関連を持たないメソッド。
「クラス名.メソッド名(引数リスト)」のようにして呼び出す。
- (インスタンス)メソッド(method)
- クラスの特定のインスタンスに関連を持つメソッド。「オブジェクト.メソッド名(引数リスト)」のようにして呼び出す。
- メソッドのオーバーロード(overload)
- 親クラスで定義したメソッドが、子クラスで再定義しなくても使えること
- メソッドのオーバーライド(override)
- 親クラスで定義したメソッドを子クラスで再定義して、親クラスでの動作と違った
動作をさせること。
どのようにクラス階層を作るかは、良いプログラムを作る上で重要な概念であ
る。これに関連してはオブジェクト指向設計、デザインパターン、フレームワー
ク等さまざまなキーワードがある。
まず、あるクラスを継承して別のクラスを作ろうと思った時には、「集合とし
て親クラスが子クラスのsuper setになっているか?」を考えてみる必要がある。
下に示すのは良くない継承の例である。
// 正方形クラス
class Square{
int width;
Square(int w){ width=w; }
void setWidth(int w){ width=w;}
int getWidth(){ return width; }
int area(){ return width*width; }
}
// 長方形クラス
class Rectangle extends Square{
int height;
Rectangle(int w, int h){
super(w):
height=h;
}
void setHeight(int h){ height=h;}
int getHeight(){ return height; }
int area(){ return width*height; }
}
正方形クラスの setWidth, getWidth を再利用しようとするだけのために、長方形を
正方形のサブクラスとして定義していますが、これは集合の包含関係を考えると間違った
設計になっています。
そういう意味では、以前の Point2D, Point3Dの例もあまり良くなかったかもしれません。
文法に関してやりのこした部分がJavaの道にかなり詳しく載っています。興味のある人はそちらを参照してください。
目次