Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
オブジェクト指向プログラミング演習
第3回 継承・オーバーライド・インタフェース
2019.04.25
前回までのお話
⚫ モジュール化
◆大きなプログラムは部品に分けて設計する
⚫ オブジェクト指向
◆モノ中心に考える
◆プログラムでは、クラス(モノの種類)を定義する
◆ある特定のモノは、インスタンスで表す
◼クラスは型、インスタンスは値
⚫ プログラムを書くときも部品ごとに書く
◆モノの部品であるモノはフィールドに書く
◆手順の部品である手順はメソッドに書く
2019.04.25
言葉の使い方に注意
⚫ クラスは「モノの種類」を表す
◆四面体を表すクラス
◆表面積を計算するクラス
⚫ メソッドは「手順」を表す
◆四面体を表すメソッド
◆表面積を計算するメソッド
2019.04.25
ところで…
「メゾット」と書いた人が複数いました
⚫ 山口はどこかで書き間違えましたか…?
⚫ メソッド(method)です。
2019.04.25
今日のお題
⚫ 継承
⚫ オーバーライド
⚫ インタフェース
2019.04.25
2019.04.25
継承(inherit)
あるクラスの性質を全て持っているクラスを定義したいとき:
⚫ 定義をゼロから全部書くのは面倒
➡ 違うところ・追加された性質だけ書きたい
オブジェクト指向には、「クラスの継承」という考え方がある:
⚫ クラスAを継承したクラスBは、Aの性質を元に変更・追加された性質を持つ
◆Aの方が、より一般的
◆Bの方が、特殊な用途のための機能が追加されている
継承の利用例
⚫ 最初から用意されている部品
◆クラスとして提供されている
◆いろいろな用途に使うため、一般的なもの
⚫ 自分のプログラムで使うとき:
◆その部品の機能を直接呼び出す書き方
◆その部品を改造した部品を作って使う書き方
◼継承を使うと中身を知らなくても改造できる
2019.04.25
プログラム例1(まずは継承なしで)
import java.awt.Frame;
public class Test1 {
public static void main(String args[]) {
Frame f = new Frame();
f.setVisible(true);
}
}
2019.04.25
Test1.java
GUIの窓(枠)を作ってみる
⚫ Frameは用意された「窓枠を作る部品」
◆Frameのインスタンスを作って、Visible(見えるよう)にする(Frameを作った当初は見えない)
◆実行すると、画面左上に小さな窓(?)が現れる
⚫ ターミナルでCtrl-Cをしないと停止しない
プログラム例2(まずは継承なしで)
import java.awt.Frame;
public class Test1 {
public static void main(String args[]) {
Frame f = new Frame("OOP");
f.setSize(600,600);
f.setVisible(true);
}
}
2019.04.25
Test1.java
さすがに小さすぎる。ちょっと改造:
⚫ Frameのコンストラクタに文字列を渡すと、窓のタイトルになる
⚫ setSizeは大きさを設定するメソッド
◆縦横のドット数を引数として渡す
2019.04.25
プログラム例3(継承を使ってみる)
⚫ 継承するには、クラスを定義するときに extends を使う
⚫ superは継承元クラスのコンストラクタを呼ぶ
◆ただし、コンストラクタの最初に書かなくてはならない
◆ 省略すると、引数無しの親コンストラクタが呼ばれる
import java.awt.Frame;
public class Test2 extends Frame {
Test2() {
super("OOP");
setSize(600,600);
setVisible(true);
}
public static void main(String args[]) {
Test2 f = new Test2();
}
}
Test2.java
このTest2は、タイトルがOOPで
大きさが600×600であるようなFrame
継承のいろいろ
⚫ 継承元のクラスをスーパークラス・上位クラスと呼ぶ
⚫ 継承している側のクラスは、サブクラス・下位クラス
⚫ サブクラスではスーパークラスで定義されたメソッドを使うことができる
2019.04.25
オーバーライド
スーパークラスで定義されたメソッドと同じ呼び出し方をするメソッドを定義すること
⚫ 同じ使い方で、別の(サブクラスで特殊化された)動作をさせることができる
2019.04.25
オーバーライドの利用例
絵を表示する窓を作るには:
⚫ 窓枠であるFrameを用意する
⚫ Frameに絵を表示する部品Canvasを付け加える
⚫ 部品を表示するとき、paintメソッドが呼ばれる仕組みになっている
◆最初から用意されているCanvasのpaintメソッドは、何もしない
◆Canvas のサブクラスを作ってpaintメソッドをオーバーライドする。
◼このpaintメソッドの中で絵を描く作業をすれば、絵が表示される 2019.04.25
プログラム例4
2019.04.25
import java.awt.*;
public class OOP4 {
Frame f;
OOP4() {
MyCanvas c = new MyCanvas();
f = new Frame("OOP4");
f.add(c); f.pack();
f.setVisible(true);
}
public static void main(String args[]) { new OOP4(); }
}
class MyCanvas extends Canvas {
MyCanvas() { setSize(600,600); }
public void paint(Graphics gc) {
gc.setColor(new Color(255,255,255));
gc.fillRect(0,0,600,600);
gc.setColor(new Color(0,0,0));
gc.drawLine(30,30,570,570);
}
}
MyCanvas は Canvas のサブクラス。ここではコンストラクタとpaintメソッドをオーバーライドしている。このコンストラクタとpaintメソッド以外は、Canvasと同じ。
絵と言っても、ここでは白地に黒い線を一本描いているだけ。
Frameのインスタンス f にMyCanvasのインスタンス c を付け加えてから、見えるようにする
java.awt の下の全クラスを使えるように import
多重継承
複数のクラスを継承したクラスを考えても良い
⚫ 多重継承をサポートしているプログラミング言語もあるが、Javaでは限定的
Javaの多重継承
⚫ クラスが継承 (extends) できるクラスは高々一つ
⚫ interface という仕組みで、メソッドを定義することを保証する、という弱い継承をサポートしている
◆クラスの定義で複数のinterfaceを指定できる2019.04.25
プログラム例5
2019.04.25
import java.awt.*;
import java.awt.event.*;
public class OOP5 implements MouseListener {
Frame f;
OOP5() {
MyCanvas c = new MyCanvas();
c.addMouseListener(this);
f = new Frame("OOP5");
f.add(c); f.pack();
f.setVisible(true);
}
public void mouseClicked(MouseEvent e) {
System.out.println("("+e.getX()+","+e.getY()+")");
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public static void main(String args[]) { new OOP5(); }
}
class MyCanvas extends Canvas {...}
マウス操作を受け取るMouseListener インタフェースを実装(implements)していることの宣言
MyCanvasのインスタンス c へのマウス操作を、この OOP5(のインスタンス)が受け取る
マウス操作に対応したメソッドが呼ばれる。
クリックしたとき、マウスの位置を表示
2019.04.25
課題の概要
⚫ ボードゲームまたはペンシルパズルをコンピュータ上で遊ぶためのゲーム盤プログラムを作成しなさい
◆人間が遊べるように作ること
◆ルール通りの動きができ、ルールに違反する動きができないようにすること
◆終了判定(勝敗判定/正解判定)を行うこと
⚫ 上記プログラムについてレポートを書きなさい
⚫ この授業で扱わない技術を用いても構わない。ただし、プログラミング言語は Java に限る
締め切り:2019年6月25日(火)17:00
提出場所:本部棟学生支援課前のレポート提出用ポスト
コンピュータが"考える"ことはしなくてよい
2019.04.25
課題のゲームまたはパズルについて
⚫ 既存のゲームやパズルを好きに選んでよい
◆ トランプや花札も可 ← カードをうまく表現してね
◆ 「オリジナルのゲーム」は不可(作りたければ授業外で勝手にどうぞ)
⚫ 複雑すぎる/単純すぎるゲームやパズルは、おすすめしない
◆ 自分で楽しめるものを選んで下さい
◆ ちょっと難しいかな、と思うものに挑戦してください
◆ 物理シミュレーションを要するゲーム(将棋崩しなど)は、おすすめしない (授業外で作るなら UNITY を使うと楽そうですね)
⚫ ゲームやパズルの参考になりそうなサイト◆ 情報処理学会プログラミング・シンポジウムの分科会 GPCC
http://hp.vector.co.jp/authors/VA003988/gpcc/gpcc.htm
◆ パズル雑誌を出している出版社ニコリ
http://www.nikoli.co.jp/ja/
2019.04.25
課題の完成度について
2回提出するうちの1回目です。
⚫ ゲーム/パズルとして成立して「一応動く」という完成度が最低ライン
◆課題に選んだゲーム/パズルのプログラムの本質的な機能を作りきってください。
⚫ 完璧なものを作ってくれても構わない
◆それでも2回目にやることはあります
2019.04.25
今後の本演習
もちろん、オブジェクト指向についての学習を進める
⚫ 毎回、少しずつ、自分の課題作成に取り組む時間を作る(つもり)
⚫ 授業で説明した内容によっては、作成中のプログラムを作り直すことになる
↑少しずつ改良していくのは、プログラミングの勉強法として有効です
その日に習ったことを、自分が作っているものに当てはめて考えるとよい。
2019.04.25
挑戦しましょう
挑戦することに成功は約束されていない。
しかし、成長は約束されている。(ザッケローニ・元サッカー日本代表監督)
⚫ 難しい課題を選択しただけでは「挑戦した」とは言えません。
◆課題の解決に向けて努力してこそ成長できるのです。
◆課題の評価は、レポートで行います。完成に向けた努力をレポートに書ききってください。