Microsoft PowerPoint - object.ppt

Similar documents
Microsoft PowerPoint - HITobject.ppt

Microsoft PowerPoint - 09-object

Microsoft PowerPoint - object.ppt [互換モード]

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

プログラミング基礎I(再)

PowerPoint プレゼンテーション

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

JavaプログラミングⅠ

Microsoft PowerPoint - chap10_OOP.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog03.ppt

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

GEC-Java

メソッドのまとめ

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

プログラミング実習I

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Java言語 第1回

Javaプログラムの実行手順

Microsoft PowerPoint ppt

Prog2_12th

Microsoft PowerPoint - prog04.ppt

プログラミング入門1

PowerPoint プレゼンテーション

JavaプログラミングⅠ

C#の基本

JavaプログラミングⅠ

レコードとオブジェクト

PowerPoint プレゼンテーション

プログラミング入門1

PowerPoint プレゼンテーション

GEC-Java

JAVA入門

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

kantan_C_1_iro3.indd

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

第2回講義

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

基本情報STEP UP演習Java対策

Prog2_9th

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

JavaプログラミングⅠ

プログラミング入門1

Microsoft PowerPoint - lec06 [互換モード]

Microsoft PowerPoint pptx

Microsoft Word - no11.docx

02: 変数と標準入出力

2

PowerPoint プレゼンテーション

Microsoft PowerPoint - handout07.ppt [互換モード]

Prog1_15th

02: 変数と標準入出力

ガイダンス

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

ガイダンス

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

ガイダンス

JavaプログラミングⅠ

ガイダンス

Sort-of-List-Map(A)

Microsoft PowerPoint - prog07.ppt

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

Microsoft Word - C言語研修 C++編 3.doc

アスペクトの相互作用を解消するアスペクトの提案

Prog1_6th

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

Microsoft PowerPoint - OOP.pptx

Microsoft PowerPoint - prog09.ppt

PowerPoint Presentation

Microsoft PowerPoint - prog09.ppt

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

メソッドのまとめ

Microsoft PowerPoint - 09.pptx

人工知能入門

ウィンドウの構成ウィンドウはタイトルバーとウィンドウ枠からなります タイトルバーには最小化 / 最大化ボタンや閉じるボタンがあります また ウィンドウはクライアント領域をもちます クライアント領域にはボタンなど GUI 部品が配置されます GUI 部品配置 ( レイアウト ) ウィンドウ ( ステー

Microsoft PowerPoint ppt

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

プログラミング入門1

Make the Future Java FY13 PPT Template

V8.1新規機能紹介記事

HCI プログラミング 10 回目テキストフィールドとキーイベント 今日の講義で学ぶ内容 テキストフィールドの利用 キーイベントの処理 テキストフィールドの利用 1 テキストフィールドを配置してみましょう テキストフィールドを用いることにより 数値や文字列などのデータ入力が可能になります ソースファ

Java講座

memo

JavaプログラミングⅠ

Prog2_9th

デザインパターン第一章「生成《

PowerPoint プレゼンテーション

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

レコードとオブジェクト

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

レコード class Point attr_accessor("x", "y") インスタンス変数の宣言 point.rb

memo

Transcription:

知能情報処理北海道大学情報工学科 AI プログラミング Java とオブジェクト指向プログラミングの基礎 知能情報処理 の授業では, 人工知能のさまざまなアルゴリズムを学ぶことになるが, 可能ならばそれを実際のプログラミング言語で実装してみることが大事である. しかし, この授業では, 時間の関係でそこまで扱うことができないので, 興味のある人が将来, 自立的に実装できるように, 最小限のプログラミングの知識を今回の授業で学ぶ. 1

AI プログラミングの簡単な歴史 1960 年代 ~ 現在 Lisp ( 関数型, リスト処理, ゴミ集め ) 1980 年代 ~ 現在 Prolog ( 論理型, パターン照合, 探索 ) 1995 年 ~ 現在 Java ( オブジェクト指向, ネットワーク,GUI) Write-Once Run-Anywhere ( プラットフォーム非依存 ) 人工知能の歴史の中で, 初期のころ (1960 年代以降 ) は,AIプログラミングといえば, それ専用のプログラミング言語を使うものと相場が決まっていた. それは基本的には LISP という の 言語だった. (garbage collection) という革新的な機能はバグを減らすのに効果的で, 現代のJavaに受け継がれている. 1980 年代になると 言語である Prolog も仲間に加わり, や といわれる処理の初歩的な機能が言語に組み込まれた. しかし, その後, プログラミング言語の研究が発展してきたことや,AIの研究テーマも多岐にわたってきたことから, 最近では, 通常のプログラミング言語でも十分 AIプログラムを書けるようになってきた. それは, プログラミング言語 Java の登場である. その特徴は, による再利用性の高いプログラミングができること. インターネット時代を反映して, が容易にできること. グラフィカル ユーザ インタフェース (GUI) のプログラミング機能が充実していることなどである. しかし, 最大の特徴は Write-Once Run-Anywhere ( 一度書けば, どこででも走る ) というキャッチフレーズで表現される可搬性 ( ポータビリティ ), あるいは OS やコンパイラなどによらない と呼ばれる性質で, 一度作ったプログラムの実行コードを再コンパイルなしに事実上どこででもただちに実行できることである. 2

構成 Part1 オブジェクト指向の基本概念 Part2 オブジェクト指向の 3 大特徴 今回の授業では, オブジェクト指向プログラミングの最も基本的な考え方を学ぶ. 具体的なプログラミングはJavaを用いるが,Javaの詳細を学ぶことが目的ではない. Part1でオブジェクト指向の基本概念を説明した後,Part2でオブジェクト指向の3 大特徴を学ぶ. 3

Part1 オブジェクト指向の基本概念 4

オブジェクトとは? データと操作をカプセル化した もの オブジェクト カプセル化 X 軸方向のみに進むロボット 位置 速度 燃料 データ ( フィールド ) メンバ どこ? 変速操作 ( メソッド ) 進め オブジェクトとは何か? その答えを短く言うと, となる. とはいえ, それで内容が理解できるとは思えないので, 順を追って内容を見ていく. この授業では,AI 的な例題として, このロボットを動かすプログラムを考える. このロボットが のつもりである. このロボットはx 軸上を進むものである. ロボットの状態は, 現在の 位置, 現在の 速度, 現在の 燃料 の3つのデータで表すことができる. それらのデータはロボットの胸のあたりに内蔵されている. このロボットはリモコンの3つの操作を受け付ける. 1つは, どこ? というボタンを押すことで, 現在位置 (x 座標の値 ) を返してくれる.( それは, たとえば, リモコンの表示画面に表示される.) 2つめは, 変速 というボタンを押して, 速度を設定できる. 実際には, このボタンを押すほかに, さらに設定すべき速度の値を補助情報として入力する必要がある. 3つめは, 進め ボタンで, これを押すと,1 秒間だけ, 現在の設定速度でロボットが前進する. リモコンからのこれらの指示を実行するためのプログラムがロボットの足のあたりに内蔵されている. オブジェクト指向プログラミングの用語では, いま述べた データ のことを, 操作 のことを という. フィールド と メソッド を総称して ということもある. 一般的なプログラミング用語で言えば, フィールドは変数, メソッドは関数のようなもので, いずれもディジタルなデータあるいはコードで表現できる. それらが, このロボットという オブジェクト の中にまとめて閉じこめられている様子を というのだが, もっと正確な説明は後にわかってくる. 重要なのは, オブジェクト というのは単なる概念ではなく, これらのディジタルなデータまたはコードからなり, コンピュータのメモリの一定領域を占める具体的な 実体 だということである. この 実体 あるいは もの が英語の object という単語の意味である. 5

メモリ内にオブジェクトがうようよできる 位置 5 8 4 速度 +1 1 2 燃料 10 8 0 どこ? どこ? どこ? 変速 変速 変速 進め 進め 進め オブジェクト は一定の実メモリ領域を占める もの であるが, ふつう, オブジェクト指向でプログラムを書くと, そのようなオブジェクトがたくさん生成される. それぞれのオブジェクトごとにメモリ領域が占められる. ロボットの場合には, このスライドのように, 状態 ( 位置, 速度, 燃料のそれぞれの値 ) の異なるロボットが生成されるわけである. ただし, 操作に相当するプログラムコードはこれらのオブジェクトに共通である. 6

いろんな種類 ( クラス ) のオブジェクトが共存する 8 1 6 7 2 4 ロボットクラス 2 3 1 船クラス オブジェクトにはいろいろな種類のものがあってよい. たとえば, オブジェクト指向で書かれたあるコンピュータゲームの中には, ロボットのほかに船が出てきて, ロボットが船に乗って, いろいろな島に渡って冒険をするのかもしれない. この場合, ロボット と 船 は異なる種類のオブジェクトである. オブジェクトの種類のことを, 正式には という. この例の場合, ロボットクラス, 船クラスという2つのクラスのオブジェクトが存在することになる. 7

オブジェクトはクラス ( ひな形 ) から生成されるインスタンス ( 実例 ) クラス 6 2 位置 速度 燃料 9 2 3 4 インスタンス 操作 ( メソッド ) は クラスで共通 どこ? 変速 進め データ ( フィールド ) は インスタンス毎 2 5 4 オブジェクト指向プログラミングで初心者がまずつまづく点は, クラス と インスタンス の区別である. とは, オブジェクトを作るための あるいは のようなものである. ロボットの例の場合, 位置, 速度, 燃料 というフィールドがあることがこの設計図に書かれている. しかし, 当然だが, その 現在の値 というのはない. 一方, とは, この設計図から作られた のことであり, 各フィールドには 現在の値 が記録されている. このスライドでは,1つのクラスから異なる3つのインスタンスが生成されている. これまで出てきた オブジェクト という言葉は, この インスタンス と同じ意味である. メソッドの具体的なコードもクラスに記述されている. このクラスからインスタンスを生成すると, 各インスタンスにはこれらのメソッドがそのままコピーされる.( ただし, これは概念上の話で, 実際には, 同じものをたくさんコピーしておくのは無駄が多いので, ポインタなどを用いて効率的に実装されている.) 以上の結果, 操作 ( メソッド ) はクラスで共通に使用され, データ ( フィールド ) はインスタンス毎に異なるものとして使われることになる. 8

Java ではクラスを記述するロボットになったつもりで書く 整数型 戻り値のデータ型 値を戻す 戻り値なし class ロボット { int 位置 ; int 速度 ; int 燃料 ; メソッド名 int どこ?() { return( 位置 ); void 変速 (int 新速度 ) { 速度 = 新速度 ; 続くクラス名 フィールド名 種々の名前には日本語を使える これがこれまで設計したロボットをJavaで記述したものである. Javaで記述するものは, 実際にはクラスである. ここではクラス名を ロボット としている. フィールドは, 従来からある他のプログラミング言語 ( たとえば,C 言語 ) における変数宣言のような形で宣言される. メソッドは,(C 言語における ) 関数定義のような形で定義される. メソッドのプログラムを書くときのコツは, 自分自身がロボットになったつもりで書くことである. どこ? メソッドは, 自分が どこ? と質問されたつもりで考えて, 戻り値として, 現在位置の値を返すことにする. 変速 メソッドは, 指定された新速度の値に変えよと命令されたつもりになって, 自分自身の状態変数である 速度 フィールドに新速度を保存する. 9

Java ではクラスを記述する ( 続き ) class ロボット { int 位置 ; int 速度 ; int 燃料 ; //---------------------- int 進め () { if ( 燃料 > 0) { 位置 = 位置 + 速度 ; 燃料 = 燃料 -1; return 0; else { return (-1); 再掲続, 自分が 進め と命令されたらどうするかを考えて書くく 進め メソッドは. ここでは, 燃料が1 単位消費され, 現在設定されている速度で1 単位時間だけ前進することとしよう. その結果, 位置 と 燃料 が更新される. この場合, 正常終了したので, エラーコードとして戻り値 0を返すような設計としてある. 燃料が0なら, エラーコードとして-1を返すことにした. 10

クラス定義の終わり コンストラクタも記述する class ロボット { int 位置 ; int 速度 ; 再掲 int 燃料 ; //---------------------- ロボット (int p, int v, int f) { 位置 = p; 速度 = v; 燃料 = f; インスタンス生成時フィールドを初期化 Constructor ロボットのインスタンスが生成されたときに, そのフィールドを初期化する ( などの ) ために, (constructor) という特別なメソッドを定義しておく. Javaではコンストラクタの名前は, クラス名と同じにするという約束になっている. この例は, ロボット というコンストラクタが, ロボットのインスタンス生成時にプログラマから引数として渡される p,v,t という3つの整数値を, それぞれ, 位置, 速度, 燃料 の3つのフィールドの現在地として記録することを表している. 11

ローカル変数宣言 ロボットを生成し, 使用するロボットのコントローラを持ったつもりで書く public class ロボットのテスト { public static void main(string args[]) { ロボット robocop = new ロボット (0,1,10); robocop. 進め (); robocop. 変速 (2); while(robocop. どこ?() < 10) { robocop. 進め (); ロボット生成 ( コンストラクタ呼出し ) ロボットを使う ( メソッド呼出し ) これはロボットを使う簡単なプログラムである. ロボットを使うプログラムを書くときのコツは, 自分がロボットのコントローラを持ったつもりで, いろいろなボタンを押しまくるように書く. ここで比喩的に言っている ボタンを押す とは, すでに定義した3つの メソッドを呼び出す ことである. この例では,new ロボット (...) によって, ロボットのインスタンスを生成し, コンストラクタの記述にしたがって, 位置 =0, 速度 =1, 燃料 =10に設定している. そのロボットを robocop と名付ける. 専門的にいうと, これは robocop という を ロボット型 と し, その変数にいま生成されたロボットへのポインタを するということである. つぎに,1 単位時間だけ進ませ, 速度を2に変え, 位置が10 以上になるまで, ループの中で進めボタンを連打する. 具体的には, robocop. ( ) の形の式を書くことによって, メソッドを呼び出す ( 実行する ) ことができる. 12

Part2 オブジェクト指向の 3 大特徴 特徴 1 カプセル化 2 インヘリタンス ( 継承 ) 3 ポリモルフィズム ( 多様性 ) 13

特徴 1: カプセル化 特徴 1 カプセル化 2 インヘリタンス ( 継承 ) 3 ポリモルフィズム ( 多様性 ) 14

いろんなクラスが出てきたら... 制作者 B 船クラス 船のフィールドの宣言 船の操作 ( メソッド ) の宣言 アクセス不可能 カプセル化 ロボットの操作 ( メソッド ) の宣言 ロボットクラス使用可制作者 A ロボットのフィールドの宣言 制作者 Aがロボットクラスをプログラミングし, 別の制作者 Bが船クラスをプログラミングしている状況を考える. これらのプログラムは最終的に1つの計算機の同一メモリ内で実行されるので, この2 人の制作者はじゅうぶんに連絡を密にして注意深くプログラムを作らないと思わぬミスが生じることがある. たとえば, 制作者 Bが, 船のメソッドの中で, ロボットのフィールドの値を勝手に変更したりするプログラムを書くと, それはロボットがロボットクラスの制作者 Aの思わぬ状態変化をするということで, 大変都合が悪い. そのため, オブジェクト指向の考え方では, 基本的に,1つのクラスの中のプログラムが, 他のクラスのフィールドの値を直接読み取ったり変更することを禁じている. そのかわり, メソッドの使用を通して, フィールドにアクセスできるようにする.( 読み書き をまとめて アクセス という.) これにより, 意図しないプログラムの動作を防止して, バグの生成を抑制したり, セキュリティを高めている. つまり, 各クラスはある種の殻によって, 内部へのアクセス方法が制限されている. あるいは, 保護されている. そこで, このような機能を と呼ぶ. スライドのピンク色の部分が殻 ( あるいはカプセル ) のつもりである. 15

カプセル化メソッドを通してのみ, フィールドにアクセス可 メソッド フィールド アクセス メソッド フィールドフィールド メソッド. メソッド名 ( 引数リスト ) メソッド オブジェクトとは, データと操作をカプセル化した もの という概念を図にするとこのような感じとなる. フィールドはメソッドの殻によって守られている. フィールドにアクセスするには, ( オブジェクト ). メソッド名 ( 引数リスト ) の形のプログラムコードを書いて, オブジェクト内のメソッドを起動するしかない. 16

ゲッター, セッター, コンストラクタは超基本メソッド class Robot { int position; int getposition() { return(position); void setposition(int p) { position = p; Robot(int p) { position = p; Getter 値を取得 Setter 値を設定 ローカル変数寿命が短い Constructor 値を初期化 最も基本的なメソッドは, (getter), (setter), (constructor) である. getterは, 値を読み取る ( ゲットする ) ためのもの. getterには, 慣習的に,getの後ろにフィールド名を付加した名前を付けることが多い. setterは, 値を書き込む ( セットする ) ためのもの.setterには, 慣習的に,setの後ろにフィールド名を付加した名前を付けることが多い. constructorは, すでに見たように, インスタンス生成時の初期設定を定義している. constructorの名前はクラス名と同じでなければならない. 17

ゲッター, セッターを通してフィールドにアクセス メソッド getposition( ) Position setposition( p ) アクセス.setPosition(10) Robot( p ) この例では,Position の値を 10 にセットするために,setPosition という setter を使用している. 18

クラス図 (API: Application Programmer's Interface) クラス名 フィールド メソッド Robot int position Robot(int p) int getposition() void setposition(int p) メンバ いつもクラスを定義したJavaのソースコードを見るのは大変なので, 設計内容の概略をこのような として図式化することが多い. このような情報は, クラスを利用して応用プログラムを作成しようとするプログラマーに対して, 利用法の を提供しているので,API (Application Programmer's Interface) と呼ばれることがある. 19

ロボットのクラス図 ロボット int 位置 int 速度 int 燃料 ロボット (int p, int v, int f ) int どこ?( ) void 変速 (int 新速度 ) int 進め ( ) コンストラクタ ゲッタ セッタ オペレータ ( 一般のメソッド ) これはこれまで作ってきた ロボット クラスのクラス図である. どこ? メソッドはgetter, 変速 メソッドは setter になっている. 進め メソッドは getter, setter のような基本的なメソッドではなく, このロボット特有の応用的なメソッドである. 20

特徴 2: インヘリタンス ( 継承 ) 特徴 1 カプセル化 2 インヘリタンス ( 継承 ) 3 ポリモルフィズム ( 多様性 ) 21

親子 再利用可能ロボット 位置 速度 燃料 容量 どこ? 変速 進め 補給 新( 継承 ) データインヘリタンス 親を再利用して子を作る 使い捨てのロボット 位置 速度 燃料 どこ? 変速 進め 親 スーパークラス サブクラス 子 新操作オブジェクト指向の特徴は, すでに作ったコードを再利用して機能拡張をしていく仕組みが整っていることである. それが ( ) という機能である. この例では, これまで作成したロボット ( 使い捨て ) を拡張して, 再利用可能ロボットを作ろうとしている. つまり, 燃料が切れたら, 燃料補給できる機能を追加する. 新しいフィールドとして燃料タンクの 容量 を追加する. 新しいフィールドとして 補給 メソッドを追加する. このようなクラス間の関係を, 図のように, 親 / 子と呼んだり, / と呼んだりする. 22

新データ操作スーパークラスの指定新新コンストラクタサブクラスの定義 新属性, 新機能, 新コンストラクタのみ記述 class 再利用可能ロボット extends ロボット { int 容量 ; void 補給 () { 燃料 = 容量 ; 再利用可能ロボット (int p, int v, int f, int c) { super(p, v, f); 容量 = c; スーパークラスを書き直したり再コンパイルする必要はない Javaではこの図のように extends 親クラス名と書くことによって, 子クラスを定義できる. 子クラスには, 新しく追加するフィールドやメソッドだけを記述する. 23

継承のクラス図 ロボット int 位置 int 速度 int 燃料 スーパークラス int どこ?( ) void 変速 (int 速度 ) int 進め ( ) 再利用可能ロボット int 容量 void 補給 ( ) クラス図を書くときには, 子クラスから親クラスに矢印を付けておく. 24

インヘリタンスの使用例 public class 再利用可能ロボットのテスト { public static void main(string args[]) { 再利用可能ロボット robo2 = new 再利用可能ロボット (0,1,10,10); for (int i=0; i<100; i=i+1) { if(robo2. 進め ()< 0) { robo2. 補給 (); robo2. 進め (); 新しいメソッド の使用継承されたメソッドの使用 進め ( ) は, 正常に進めたら 0, 燃料切れで進めなかったらー 1 を返す. この例では, 進め ボタンを 100 回連打する. ただし, 途中で燃料切れになったときは, 燃料を補給して, ボタンを押し直している. 25

特徴 3: ポリモルフィズム ( 多様性 ) 特徴 1 カプセル化 2 インヘリタンス ( 継承 ) 3 ポリモルフィズム ( 多様性 ) 26

polymorphism ポリモルフィズム ( 多様性 ) 同じメッセージでもクラスによって処理が異なる 進め ロボットクラス. 進め ( ) メッセージ 先生クラス 進め 授業を進める. 進め ( ) 船クラス 進め. 進め ( ) ここに図示してある3つのクラスに, いずれも 進め メソッドがあるとしよう.3つのメソッドの内容 ( プログラムコード ) は全く異なるものである. ロボットが 進む とは, 足を動かすプログラムコードを実行することだし, 船が 進む とは, スクリューを回転させるコードを実行することである. 先生が 進む とは, 脱線していた授業を進ませることである. したがって, 本来なら異なるメソッド名を付けるのがスジである. しかし, 人間にとって 進め という言葉がメソッド名として適切なら, その言葉を共通して使えるようにした方が便利で, 言葉数の節約になり, 人間にとって心理的に覚えやすい. プログラミングの世界でもその考え方を採り入れたのが という機能である.( このスライドでは という和訳を採用したが, と呼ばれるときもある.) オブジェクト思考の言葉で述べると, という機能である. 27

型の階層 ( 包含 ) 進めるもの型 ロボット型船型先生型 進め 進め 進め そのような複数のクラスをまとめて, やや抽象的な意味での クラス ( あるいは データ型 ) にすることもできる. この例ではそれを 進めるもの という名前のクラスにしている. 28

進めるもの のインタフェース interface 進めるもの { int 進め (); 抽象メソッド Javaでこの考え方を実現する方法の1つが, というものである. このJavaコードは, 進めるもの クラスは, int 進め (); というメソッドを共通に持っていることを宣言している. 29

進めるもの の実装 ここを追加する class ロボット implements 進めるもの { int 位置 ; int 速度 ; int 燃料 ; int どこ?() { return( 位置 ); void 変速 (int 新速度 ) { 速度 = 新速度 ; int 進め () { if ( 燃料 > 0) { 位置 = 位置 + 速度 ; 燃料 = 燃料 - 1; return 0; else { return (-1); ロボットクラスが, 進めるものクラスでもあることを,implements というキーワードを用いてこのスライドのように記述する. このような場合, ロボット クラスは 進めるもの インタフェースを という. 30

実装のクラス図 interface 進めるもの int 進め ( ) ロボット int 位置 int 速度 int 燃料 int どこ?( ) void 変速 (int 速度 ) int 進め ( ) 実装 ロボットが 進めるもの を実装していることを, このようなクラス図で表す. 31

ポリモルフィズムの使用例いろいろな 進めるもの を統一的に進ませる 進めるもの A[] = new 進めるもの [3]; A[0] = new ロボット (0,1,10); A[1] = new 船 (" 横浜 "); A[2] = new 先生 (" 数学 "," 舞黒素太 "); for(i=0; i<3; i = i+1) A[i]. 進め (); 配列0 1 2 A 進め 進め 進め この例では, 第 1 行目で, 進めるもの を3つまで記憶できる配列 A を用意している. 整数の配列を用意するときに, int A[ ] = new int[3]; のように書くのと同じ理屈で,int のところは 進めるもの というデータ型としただけである. それぞれ, ロボット, 船, 先生のインスタンスを代入し, ループの中で, 進め という同じ名前のメソッドによって,( 異なる意味と異なるメカニズムのもとで ) それぞれを進ませている. すなわち, ループの1 周目にはロボットが足を動かして進み,2 周目には船がスクリューを回転させて進み,3 周目には先生が授業を進める. このような処理が, この1 行で記述できるのは驚きである. このようなプログラミングテクニックは Java のプログラムコードでは実にたくさん見かけるものであるので, ぜひ覚えておこう. 32

オブジェクト指向のまとめ 基本用語 オブジェクト, フィールド, メソッド, メンバ クラス, インスタンス ゲッタ, セッタ, コンストラクタ スーパークラス, サブクラス, クラス図 インタフェース, 抽象メソッド, 実装 特徴 1 カプセル化 2 インヘリタンス ( 継承 ) 3 ポリモルフィズム ( 多様性 ) このスライドでまとめた用語のおよその意味が, それぞれ数秒で想起されるように復習してほしい. 33