Fateで分かるオブジェクト指向

# オブジェクト指向わかりにくくない？

プログラミング勉強してて、オブジェクト指向をマスターしよう！みたいな記事を見ると

- オブジェクトが～
- クラスを作って～
- カプセル化が～
- ポリモーフィズムを～

みたいな事が淡々と書かれていて

**いや！結局オブジェクト指向ってなに！！**

ってなりまして・・・
色々調べた結果、**プログラミングの手法の1つだよ**っていうのが1番わかりやすかったのですが、肝心などんなプログラムの手法なのかを**Fate**を使って分かりやすく説明しようという試みです。

# Fate[^1]で説明する前に
[^1]: 主にFateZero、fate stay nightから抜粋
この記事を見ていただいているということは、すでにFateを見たことがあったり、Fateシリーズのファンの方々が多いとは思います。

ですが、Fateを知っているがあまり覚えていなかったり、どうゆう話かは知っているくらいの知識の方もいらっしゃると思うので、先にFateの世界観をざっくりと説明したいと思います。

Fateの世界では
聖杯戦争、7人の魔術師と7騎の<font color="SeaGreen">｢サーヴァント｣</font>が戦い、
最後に残った1組が聖杯(あらゆる願いを叶えるとされる万能の願望機・聖杯)を手にする魔術儀式が行われます。[^2]
[^2]: Fateシリーズ全てで聖杯戦争が行われるわけではない
<n\>
この時、召喚されるサーヴァントは

- セイバー
- アーチャー
- ランサー
- ライダー
- キャスター
- アサシン
- バーサーカー

の7種類の**クラス**に分類されます。


# クラス・継承・オーバーライドの3つをFateと合わせて説明していきます
まず、オブジェクト指向のプログラミング手法には大きくわけて

- クラス
- 継承
- オーバーライド

の3種類で構成されてます。

とりあえず、こんなものがあるんだ程度で覚えてください。



## Class
Classというのは、一般的なプログラミング界隈で言うところの
オブジェクト(形)の**設計図**になります。

設計図ではわかりにくいので、ここでは**構成要素**としましょう。

Fateで置き換えると
**サーヴァントの構成要素(サーヴァントClass)
セイバーの構成要素(セイバーClass)**
と言った具合になります。

いや、**構成要素**ってなんだよ！余計わかりにくいわ！
って思いますよね。

より具体的にClassの構成要素について話します。

まずはなんのクラスを作るか決めましょう。
今回はサーヴァントのClass(構成要素)を作ります。

このサーヴァントclassは、クラスの大元となります。
そういったもとになるクラスの事を

- **親クラス**
- **スーパークラス**

と呼びます。

<font color="LightSeaGreen">Class</font>を作るには2つの要素が必要です。

1.**メソッド**
<font color="OrangeRed">メソッド</font>はその<font color="LightSeaGreen">クラス</font>の特徴です。

2.**属性**
<font color="RoyalBlue">属性</font>は<font color="LightSeaGreen">クラス</font>の特徴に**必要な機能(要素)**です。
<n\>
<n\>


![iOS の画像 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964652/2374a40d-984c-971b-4ace-e28cdec9cede.jpeg)
イラスト:[小上和雄](https://twitter.com/ogami_kazuo)(著者の別名義)
<n\>
<n\>
<n\>


コードっぽく書くとこんな感じ


<font color="LightSeaGreen">サーヴァントClass(object)</font>:
初期情報
def<font color="OrangeRed"> __ init __</font>(Self, <font color="RoyalBlue">属性</font>(<font color="RoyalBlue">真名、宝具、歴史</font>))
特徴
def <font color="OrangeRed">召喚</font>(Self, <font color="RoyalBlue">属性</font>(<font color="RoyalBlue">聖遺物、魔力</font>))
特徴
def <font color="OrangeRed">戦力</font>(Self, <font color="RoyalBlue">属性</font>(<font color="RoyalBlue">魔力、スキル</font>))

と言ったものが<font color="LightSeaGreen">**Class**</font>です。


## 継承
これは言葉通りの意味合いです。

先ほど説明した、**親クラス**や**スーパークラス**から、**「継承」**、**「オーバーライド」**したクラスの事を

- **子クラス**
- **サブクラス**

などと呼びます。

サーヴァントの**設計図**(構成要素)は出来ています。

次は、その設計図を元に**セイバー**で<font color="LightSeaGreen">**クラス**</font>を作っていきましょう。
<font color="LightSeaGreen">クラス</font>の作り方自体は変わりありませんが、
これはサーヴァントって存在のセイバーっていう**役割**なんだよって示す必要があります。

なので、

<font color="LightSeaGreen">セイバーClass(**サーヴァント**</font>):
となります。
<n\>
<n\>
![iOS の画像 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964652/b53446a4-6ea0-bab9-7d98-b5ea155e3feb.jpeg)
イラスト:[小上和雄](https://twitter.com/ogami_kazuo)(著者の別名義)
<n\>
<n\>
<n\>
これで、継承は終わりました。

大事なのはここからで継承した後は、セイバーだけの**特徴を定義しなければいけません**。

同じサーヴァントでもセイバーとアサシンの特徴は特徴は全く異なりますよね？

そう言うことです。

セイバーの<font color="OrangeRed">メソッド(特性)</font>
最高の<font color="OrangeRed">「対魔力」</font>とある程度の<font color="OrangeRed">「騎乗スキル」</font>を保有する。
これがセイバークラスの<font color="OrangeRed">特徴</font>なので

<font color="LightSeaGreen">セイバーClass(**サーヴァント**)</font>:
セイバーの<font color="OrangeRed">特徴</font>
def <font color="OrangeRed">対魔力</font>(Self)
セイバーの<font color="OrangeRed">特徴</font>
def <font color="OrangeRed">騎乗スキル</font>(Self, <font color="RoyalBlue">乗り物</font>)
と言うことになります。



## オーバーライド
オーバーライドは継承とは異なりサーヴァントとは異なる基本情報を持っているクラスのことです。

**エクストラクラス**を例にあげてみたいと思います。

**エクストラクラス**はFateに存在する基本の7種類のクラスとは**異なり**、特質したサーヴァントに対し与えられるクラスです。

エクストラクラスに分類されるサーヴァントは、同じサーヴァントではあるものの、特殊な能力を有するという共通点があります。
<n\>
<n\>
![iOS の画像 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964652/cadadcd2-95be-5be3-bf5f-812b545e9ae8.jpeg)
イラスト:[小上和雄](https://twitter.com/ogami_kazuo)(著者の別名義)
<n\>
<n\>
<n\>
コード風にするとこんな感じです。

<font color="LightSeaGreen">エクストラClass(**サーヴァント**)</font>:
初期情報
def<font color="OrangeRed">__ init __</font>(Self, 属性(<font color="RoyalBlue">エクストラスキル、真名、宝具、歴史</font>))
特徴
def <font color="OrangeRed">召喚</font>(Self, 属性(<font color="RoyalBlue">聖遺物、魔力</font>))
特徴
def <font color="OrangeRed">戦力</font>(Self, 属性(<font color="RoyalBlue">魔力、スキル</font>))

やってることは継承に似ていますが、オーバーライドの場合は同じサーヴァントclassの中ではありますが、
本来持っている**親クラス(サーヴァントclass)**の初期情報を言わば上書きし直している感じです。


# まとめ

Fateを使ったオブジェクト指向はいかがだったでしょうか？

このclassを使ったプログラミング手法を一言で表すとオブジェクト指向になります。

オブジェクト指向には、この３つ以外にも様々な考え方が含まれていますが、それをひとまとめにすると分かりずらくなってしまうので本当に必要最低限に説明しました。

いやいや、Fateで説明してもわからんかったわ！
Fateじゃ分かりにくいよぉ

と思った方もいたかもしれません。

そうなった場合は、オブジェクト指向やプログラミングの知識を自分の好きな漫画やアニメに例えながら考えをまとめてみるというのも、学習する上で効果的だと私は考えておりますので、自分なりにやってみてもよいと思います！