[ポリモーフィズムとは?]具体例で考える

## こんな人に読んでほしい
- ポリモーフィズムって言葉は聞いたことがある
- ググってもイマイチわからない
- 具体例を出して説明してほしい

## 具体例
ここはブック○フ。最近は、本も洋服もゲームも売っている。

こことコンビニさえあれば、一生生きていけるなぁ、
そんなことを思っていた矢先、在庫を管理するシステムの設計を任された。

先輩 「まず、在庫の情報を出力するコードをかいてね☆」

さぁ、こんなときどんなコードを書きますか？？

## ポリモーフィズムを一言でいうと
ポリモーフィズム(多態性)の文字通り、同じメソッド名なのに、
クラスによって実行結果が変わる

## 今回の例でいうと
Itemを継承しているBook、GameSoft、Clotheにおいて定義したprintメソッドがあり、それを呼び出すと、それぞれの子クラスに合わせて違う結果を返してくれる

## 情報の整理
- 在庫(stock)にある商品(item)には全て、title, price, categoryがある
- 商品の種類は3種類
    - 本(book): 著者(author)の情報がある
    - 洋服(clothe): ブランド(brand)の情報がある
    - ゲーム(gamesoft): どの機種のゲームか(platform)
という情報がある
### 継承関係を示す
Book, GameSoft, ClotheはそれぞれItemを継承している
![class.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294789/670c2a84-91c6-bd91-de5a-254507748cfd.png)
## コードをかいていく
> まずはポリモーフィズムを使わない例から
### クラス
```ruby
class Item
    attr_reader :title, :price, :category
    
    def initialize(category, title, price)
        @category = category
        @title = title
        @price = price
    end
end
```
```ruby
class Book < Item
    attr_reader :author

    def initialize(category, title, price, author)
        super(category, title, price)
        @author = author
    end
end
```
```ruby
class GameSoft < Item
    attr_reader :platform

    def initialize(category, title, price, platform)
        super(category,title, price)
        @platform = platform
    end
end
```
```ruby
class Clothe < Item
    attr_reader :brand

    def initialize(category, title, price, brand)
        super(category, title, price)
        @brand = brand
    end
end
```
### データの準備
- 本には昔から好きな小説
- ゲームには人生で初めて１０００時間以上プレイしたゲーム
- 洋服はよく行くお店の名前
```ruby
book_stocks = []
gamesoft_stocks = []
clothe_stocks = []

book_stocks << book = Book.new('ゴールデンスランバー', 980, '伊坂幸太郎')
gamesoft_stocks << gamesoft = GameSoft.new('ドラゴンクエスト8', 4980, 'ps2')
clothe_stocks << clothe = Clothe.new('ネルシャツ', 1980, 'Uniqlo')
```
### データの出力
```ruby
    book_stocks.each do |book_stock|
        puts "#{book_stock.author}:#{book_stock.title}:#{book_stock.price}"
    # -> 伊坂幸太郎:ゴールデンスランバー:980
    end

    gamesoft_stocks.each do |gamesoft_stock|
        puts "・ゲーム【#{gamesoft_stock.platform}】#{gamesoft_stock.title}:#{gamesoft_stock.price}"
    # -> 【ps2】ドラゴンクエスト8:4980
    end

    clothe_stocks.each do |clothe_stock|
        puts "{clothe_stock.brand}-#{clothe_stock.title}:#{clothe_stock.price}"
    # -> Uniqlo-ネルシャツ:1980
    end
```
> 次はポリモーフィズムを使う例
### クラス
Itemクラスの内容は同じ
```ruby
class Book < Item
    attr_reader :author

    def initialize(category, title, price, author)
        super(category, title, price)
        @author = author
    end
    # 以下を追記
    def print
        puts "#{@author}:#{@title}:#{@price}"
    end
end
```
```ruby
class GameSoft < Item
    attr_reader :platform

    def initialize(category, title, price, platform)
        super(category,title, price)
        @platform = platform
    end
    # 以下を追記
    def print
        puts "【#{@platform}】#{@title}:#{@price}"
    end
end
```
```ruby
class Clothe < Item
    attr_reader :brand

    def initialize(category, title, price, brand)
        super(category, title, price)
        @brand = brand
    end
    # 以下を追記
    def print
        puts "#{@brand}-#{@title}:#{@price}"
    end
end
```
### データの準備
```ruby
stocks = []
# データを準備
stocks << Book.new('本', 'ゴールデンスランバー', 980, '伊坂幸太郎')
stocks << GameSoft.new('ゲーム', 'ドラゴンクエスト8', 4980, 'ps2')
stocks << Clothe.new('洋服', 'ネルシャツ', 1980, 'Uniqlo')
```
### データの出力
```ruby
    # ポリモーフィズムを使うと圧倒的に綺麗に書ける
    stocks.each{|stock| stock.print}
```
以上で終わります！