© 2017 Embarcadero Technologies, Inc.
All rights reserved. Proprietary and confidential.
第7回
‟オブジェクト指向„
シーズン2:プログラミング言語をやさしく覚えよう
C++Builderの部
2© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
Delphi / C++Builder Starter チュートリアルシリーズ
シーズン2 :2017年1月23日~ 3月27日全 9 回
時間 :毎週月曜 17 時 00分~17時 50分
Delphi 17時00分~17時20分 / C++Builder 17時30分~17時50分
ねらい :プログラミング言語をやさしく覚えようシーズン2
第1回 2017年1月23日 シューティングゲームのプログラム
第2回 1月30日 変数と型
第3回 2月6日 条件とループ
第4回 2月13日 関数
第5回 2月20日 配列と構造体
第6回 2月27日 文字列とオブジェクト
第7回 3月6日 オブジェクト指向
第8回 3月13日 作ってみよう(1)
第9回 3月27日 作ってみよう(2)
セミナー情報 :下記のWebサイト
http://forms.embarcadero.com/starter-tutorial-webinar
3© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
第7回「オブジェクト指向」
今日のねらい
• クラス・オブジェクトの機能を知る
• 隠蔽、継承を知る
実施内容
• 隠蔽、継承とはどんなものか
• 隠蔽する方法
• 継承する方法
• まつわるあれこれ
4© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
無料版 C++Builder 10.1 Berlin Starter Edition 入手方法
• シリアルキーを知らせるメール内にも再ダウンロードリンク有
• ダウンロード、インストール参考ブログ:https://goo.gl/CCBNdx
エンバ
Web製品
C++
Builder
Starter
バナー登録 Get
無料で使える開発環境をダウンロード
EDN*に登録済の方はEDNアカウントでダウンロード可
登録完了後、自動でインストーラーのダウンロード開始
インストール時にシリアルキーを入力
登録時のメールアドレスにシリアルキーが配信される
5© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
オブジェクト指向とは?
オブジェクト指向に対する考え方は諸説ありますが……
• データと操作の関係性を定義すること(クラス定義)
• すでに存在するオブジェクトの機能を流用できること(継承)
• 内部処理の複雑な部分は隠して、わかりやすく操作できるようにすること
(カプセル化)
• 異なるクラスに同じ操作を行ったときに、それぞれのクラスの機能に応じ
て適切な処理が行われること(ポリモーフィズム)
6© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
それぞれの車種の基本構成がクラス定義。注文するとインスタンスが生成さ
れる。納品された現物がインスタンス。運転操作はメソッド。
車を買う場合の話を例にあげてみると
同じ車種でも実体が違う
車種Xの基本構成= クラス定義
車種X(Aさんの注文)= インスタンス
車種X(Bさんの注文)= インスタンス
車種X(Cさんの注文)= インスタンス
オプションを選んで注文する= インスタンスの生成
基本的な運転操作方法(メソッド)は同じ
7© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
オブジェクトの設計図
型と操作が宣言、定義されている
クラスとは?
同じ車種でも実体が違う
車種Xの基本構成= クラス
# メーカー名# 車種# 色
{ 運転方法 }
{ 施錠方法 }
{ メンテナンス }
車種X(Aさんの注文)= インスタンス
車種X(Bさんの注文)= インスタンス
車種X(Cさんの注文)= インスタンス
オプションを選んで注文する= インスタンスの生成
基本的な操作方法(メソッド)は同じ
8© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
クラスにもとづいてオブジェクトを実体化したもの
初期化条件が違えば同じクラスから異なる実体が生成される
インスタンスとは?
同じ車種でも実体が違う
車種Xの基本構成= クラス
# メーカー名# 車種# 色
{ 運転方法 }
{ 施錠方法 }
{ メンテナンス }
車種X(Aさんの注文)= インスタンス
車種X(Bさんの注文)= インスタンス
車種X(Cさんの注文)= インスタンス
オプションを選んで注文する= インスタンスの生成
基本的な操作方法(メソッド)は同じ
9© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
インスタンスに対する操作方法
同じクラスなら実体が違っても操作方法は同じ
メソッドとは?
同じ車種でも実体が違う
車種Xの基本構成= クラス
# メーカー名# 車種# 色
{ 運転方法 }
{ 施錠方法 }
{ メンテナンス }
車種X(Aさんの注文)= インスタンス
車種X(Bさんの注文)= インスタンス
車種X(Cさんの注文)= インスタンス
オプションを選んで注文する= インスタンスの生成
基本的な操作方法(メソッド)は同じ
10© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
クラスやインスタンス(オブジェクト)の属性値
処理の結果によらす不変の値と変化する値がある
プロパティとは?
同じ車種でも実体が違う
車種Xの基本構成= クラス
# メーカー名# 車種# 色
{ 運転方法 }
{ 施錠方法 }
{ メンテナンス }
車種X(Aさんの注文)= インスタンス
車種X(Bさんの注文)= インスタンス
車種X(Cさんの注文)= インスタンス
オプションを選んで注文する= インスタンスの生成
[ 変化しない値]
# メーカー名# 車種# 色……
[変化する値]
# 積算走行距離# 燃料の量# 乗車人数# 荷物の量# 施錠状態……
11© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
カプセル化?
内部処理の複雑な部分を隠して、わかりやすく操作できるようにすること
車(AT車)の運転で必要なことは「適切な速度にするためのアクセルやブレーキのコントロー
ル」と「ハンドル操作」
「アクセル操作がどのようにエンジンを動かしているか」や「ハンドル操作がどのように
ホイールの向きを変えているか」の細かい話はあまり意識しなくともよい。(カプセル化
されているといえる)
カプセル化された部分はクラスやインスタンスの外部からは操作させない
private, protected, public 指定により、メンバの参照範囲を制限できる
同じクラス 派生クラス クラス外
public ○ ○ ○
protected ○ ○ ✕
private ○ ✕ ✕
12© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
クラスの定義方法によるメンバの見え方の違い
クラスは class{} だけではなく、実は struct{} でも定義できる
• class{} と struct{} の違いはメンバの参照可能範囲の違い
class{} で定義したクラスのメンバは、すべて private である
• protected や public で利用したいメンバは明示が必要
struct{} で定義したクラスのメンバは、すべて public である
• protected や private で利用したいメンバは明示が必要
13© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
すでに存在するクラス定義(基底クラス)をベースとして、そこから派生し
た別のクラス(派生クラス)を作ること
基底クラスの型や操作は派生クラスに引き継がれる
派生クラスでは新たなプロパティやメソッドを持つこともできる
class: 車種Xをベースにしたパトカー
継承とは?
class: 車種X
# 色# 排気量・馬力
{ 運転操作 }
# パトカー専用の塗装# 赤色回転灯# 後部座席のドアロック# 無線# スピードレーダー
{ 回転灯の操作 }
{ 無線操作}
{ スピードレーダーの操作 }
14© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
オーバーライドとオーバーロード
オーバーライド = 基底クラスのメソッドを派生クラスで上書きすること
オーバーロード = 同じ名前の複数のメソッドが異なる引数や戻り値をとる
こと
同じ名前のメソッドでクラスの機能に適した処理を実装できることを、ポリ
モーフィズムという
例えば、[自動車]クラスと[オートバイ]クラスを new する操作は、生成され
るインスタンスの内容は当然異なるが、しかしインスタンスが生成されると
いう点では同じ
15© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
サンプルコード
サンプルコードは下記のリポジトリに掲載いたします
• https://github.com/kazinoue/2017_StarterTutorial_S2
16© 2017 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
第7回「オブジェクト指向」まとめ
今日のねらい
• クラス・オブジェクトの機能を知る
• 隠蔽、継承を知る
実施内容
• 隠蔽、継承とはどんなものか
• 隠蔽する方法
• 継承する方法
• まつわるあれこれ