Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
EZ-‐‑‒NET  熊⾕谷友宏  
http://ez-‐‑‒net.jp/
2015.07.11  
@  yidev  第20回勉強会
クラス継承とプロトコル拡張
Swift  カジュアルプログラミング
熊谷友宏
EZ-NET http://ez-net.jp/
@es_kumagai
Xcode 5 徹底解説
IP Phone 音でダイヤル 音で再配達ゴッド
いつもの電卓
with 割勘ウォッチ
MOSA
WWDC2015 情報共有会で
プロトコル拡張について発表してきました。
http://connpass.com/event/16691/
@yucovin
@akio0911@esum1527
発表後にツイッターを眺めていると
『プロトコル拡張って多重継承の一種?』
そこで
クラス継承とプロトコル拡張を
ざっくり比較してみる
多重継承
クラス継承
機能を特化して積み上げる
クラス継承
⽣生物
⽣生きる機能を実装  
消化器・循環器・呼吸器など
動物
動く機能を実装  
運動神経・関節など
⾁肉⾷食
⾷食事を⾁肉に限定  
必要な機能を実装
猫
広くを想定目的に特化
猫
にゃーと鳴く、⽑毛繕いなど  
猫らしい機能の実装
今までの資産を活かせる
クラス継承
⽣生物
動物
⾁肉⾷食
⽝犬猫
⽝犬
機能を流流⽤用して  
新しいものを⽣生成
▶ 制作コストの削減
▶ どちらも 動物 として

扱える
特徴を併せ持つとき
クラス継承
⽣生物
動物
⾁肉⾷食
⽝犬猫
⽝犬
⽝犬って雑⾷食
▶ 犬で雑食性を追加?
草⾷食機能を独⾃自実装?
特徴を併せ持つとき
クラス継承
⽣生物
動物
⾁肉⾷食
⽝犬猫
⽝犬
純⾁肉⾷食
▶ 肉食と草食を継承?

多重継承 (C++)
雑⾷食性 草⾷食
草⾷食動物を作って継承?
プロトコル拡張
特徴で対象を説明する
プロトコル
猫
▶ 対象は猫型
▶ 特徴をプロトコルで表現
⾁肉⾷食型
⾛走れる
鳴ける
歩ける
特徴に機能を添える
プロトコル拡張
猫
⾁肉⾷食型
⾛走れる
鳴ける
▶ プロトコルに

機能を関連付ける
歩ける
⾁肉を⾷食べさせる
鳴かせる
前に進ませる
右を向かせる
特徴を型で具現化する
プロトコル指向
猫
特徴の実現に必要な

猫固有の機能を実装
⾁肉⾷食型
⾛走れる
鳴ける
▶ 必要最低限の機能を

型に実装する
歩ける
⾁肉を⾷食べさせる
鳴かせる
前に進ませる
右を向かせる にゃーと鳴くのはここで実装
対象ごとに特徴から組み立てる
プロトコル指向
猫
鳴ける
⾛走れる
⾁肉⾷食型
歩ける ⽝犬
⾁肉⾷食型
⾛走れる
吠え
れる
草⾷食性
歩ける
複数のプロトコル拡張を継承
プロトコル指向
猫
鳴ける
⾛走れる
⾁肉⾷食型
歩ける ⽝犬
⾁肉⾷食型
⾛走れる
吠え
れる
草⾷食性
歩ける
鳴かせる
前に進ませる
右を向かせる
⾁肉を⾷食べさせる
吠えさせる
草を⾷食べさせる
多重継承?
特徴を観察
クラス継承
紛れもない多重継承
クラス継承
⽣生物
動物
⾁肉⾷食
⽝犬猫
⽝犬
草⾷食
▶ 同じ機能があると複雑に
▶ どちらを使ったら良いか
紛れもない多重継承
クラス継承
⽣生物
動物
⾁肉⾷食
⽝犬猫
⽝犬
草⾷食
▶ 共通する親を持つ場合が

さらに話を難しくする
プロトコル拡張
特徴それぞれが機能を持つ
プロトコル拡張
⽝犬
⾁肉⾷食型
⾛走れる
吠え
れる
草⾷食性
歩ける
前に進ませる
右を向かせる
⾁肉を⾷食べさせる
吠えさせる
草を⾷食べさせる
▶ 複数の特徴を継承する
▶ 多重継承にも似ているが

それぞれの階層は浅い
⽝犬
継承に見えるところ
プロトコル拡張
⾁肉⾷食型
⾛走れる
吠え
れる
草⾷食性
歩ける
⾁肉を⾷食べさせる
吠えさせる
草を⾷食べさせる
▶ 歩ける を継承して

走れる を作っている?
前に進ませる
右を向かせる
▶ 上位へ進化というより

特徴をあわせ持つ?
▶ 優位性は若干ある
継承というより
プロトコル拡張
歩ける
⾛走れる
合わせてひとつ?
進ませる  (歩き)
進ませる  (⾛走り) 歩ける ⾛走れる
下位
上位 歩けて・走れる
進ませる  (⾛走り)進ませる  (歩き)
右を向かせる
右を向かせる
守備範囲を観察
クラス継承
肉食動物の守備範囲
クラス継承
⽣生物
動物
⾁肉⾷食
⽝犬猫
▶ 生物の起源までが範疇
肉食動物の守備範囲
プロトコル拡張
猫
⾁肉⾷食型
⾛走れる
鳴ける
歩ける
⾁肉を⾷食べさせる
鳴かせる
▶ 肉を食べれること、以上
前に進ませる
右を向かせる
影響範囲を観察
犬に雑食性をもたせたくなったら
クラス継承
⽣生物
動物
⾁肉⾷食
⽝犬猫
⽝犬
▶ 多重継承が無理なら

動物で受け入れる?
▶ 猫にも影響が及ぶかも
草⾷食
⿅鹿鹿
“なんでも⾷食べる”  を追加
⾁肉⾷食に制限
“なんでも⾷食べる”

を再解禁
!
!
!
!
?
犬に雑食性をもたせたくなったら
プロトコル指向
⽝犬
⾁肉⾷食型
⾛走れる
吠え
れる
草⾷食性
▶ 犬に草食性をプラス
▶ 他には影響しない
猫
⾁肉⾷食型
⾛走れる
鳴ける
⿅鹿鹿
草⾷食型
⾛走れる
!
生物の常識を覆す新発見 !?
クラス継承
⽣生物
動物
⾁肉⾷食
⽝犬猫
⽝犬
▶ 生物界に激震
草⾷食
⿅鹿鹿
!
!
!
!
!
!
!
新種
♪
生物の常識を覆す新発見 !?
プロトコル指向
⽝犬
⾁肉⾷食型
⾛走れる
吠え
れる
草⾷食性
▶ 新しいプロトコルが

生まれるかも
猫
⾁肉⾷食型
⾛走れる
鳴ける
⿅鹿鹿
草⾷食型
⾛走れる
新常識識
♪
可読性を観察
犬って雑食?
クラス継承
⽣生物
動物
⾁肉⾷食
⽝犬猫
⽝犬
▶ 表面から分からない?
▶ 読み解く必要がある
草⾷食
とりあえず⾷食べれる
でも⾁肉だけみたい
草⾷食ではなさそう
犬って雑食。
プロトコル
▶ プロトコルで一目瞭然
⽝犬
⾁肉⾷食型
⾛走れる
吠え
れる
草⾷食性
歩ける
実装を観察
汎用的な土台から積み上げる
クラス継承
▶ 土台の設計が重要
▶ 汎用化が ?
⽣生物
動物
⾁肉⾷食
⽝犬
⽣生物
動物
⾁肉⾷食
猫
具体的な特徴で説明する
プロトコル拡張
▶ 特徴の切り出しが重要
▶ 抽象化が ?
⽝犬
⾁肉⾷食型
⾛走れる
吠え
れる
草⾷食性
猫
⾁肉⾷食型
⾛走れる
鳴ける
動物
⽣生物
汎⽤用的すぎると  
扱いにくそう
アクセス範囲を観察
▶ 親の公開範囲を

自分より狭くできない
継承先ほど狭める方向へ
クラス継承
⽣生物
親クラスをまるごと

秘密にはできない
動物
⾁肉⾷食
⽝犬猫
親と同じか低い

アクセス範囲が必要
親が internal なら子は internal 以下
❌  Private  
⭕  Public
Internal
歩ける
⾛走れる
元と同じか

狭いアクセス範囲で
元の想定範囲は

広げられない
▶ 元の公開範囲より

広いものは作れない
継承先ほど狭める方向へ
プロトコル継承
元が internal なら新しいものは internal 以下
Internal
❌  Private  
⭕  Public
▶ 型の公開範囲より

小さくても準拠可能
▶ 最大でも型の範囲まで
アクセス範囲はそれぞれ次第
型のプロトコル継承
⽝犬猫
プロトコルが internal 指定ならその機能は internal 以上
歩ける
⾛走れる
集会
できる
型より⼩小さい

アクセス範囲も可能
機能のアクセス範囲は  
各プロトコル以上で
これが求める機能の範囲は  
このプロトコルの範囲以上で
Internal ⭕  Public
⭕  Private
⭕  Internal
まとめ
クラス継承とプロトコル拡張は
かなり性格が違う印象
性格の違いを意識して使うと
使い分けの仕方が見えてくるかも?
クラス継承とプロトコル拡張
▶ クラス継承
✴ 機能を特化して積み上げる
✴ 汎用性を意識した設計
✴ 特徴を知るとは全てを知ること
✴ 常識を覆したときの影響範囲が広い?
▶ プロトコル拡張
✴ 特徴で対象を説明する
✴ 特徴を意識した設計
✴ 特徴が一目瞭然
✴ 常識を覆すと新しいプロトコルが誕生?

More Related Content

Swift : クラス継承とプロトコル拡張を比べてみる #yidev