Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

多様性とは

f:id:raspberrypi:20220407154254j:plain

ブログ管理者のP.Hです!

今回はオブジェクト指向の多様性について解説しようと思います。 オブジェクト指向の機能の中で一番理解しずらいのがこの多様性の機能だと思います。 また、実際に使う機会も少ないのではないかと思っています。私の個人的な感覚ですが、 オブジェクト指向の3つの機能の重要度は

  1. カプセル化:65%
  2. 継承:30%
  3. 多様性:5%

こんな感じじゃないかなと思います。重要なカプセル化や継承をしっかり勉強した方が良いと思います。 自分でコードをうまく書けなくてもいいので、まずは読めるようになれば十分かもしれません。 それでは解説してきます。

多様性とは

概要説明の記事でも書きましたが、アタッチメントのイメージです。 メイン部分は変えずにアタッチメントを作ることで機能を増やすことができます。 アタッチメントを増やすことで簡単に機能を増やすことができる = 多様性です。

アタッチメントは接続部分が同じものでなければなりません。同じでなければ、接続ができません。 プログラムも同じです。プログラムでは、以下の条件を満たす必要があります。

  • あるひとつのクラスから継承して、アタッチメントのクラスを作る必要がある。 これにより、クラスの形を同じすることができる(接続部分が同じになる)。

言葉だけだとわかりにくいので、例を見てみましょう。

多様性のコードの例

下記が多様性の例になります。

class MyClass: # 継承されるクラス
    
    def get(self):
        print("MyClass")

class MyClassA(MyClass): # MyClassを継承

    def get(self): # get関数をオーバーライドして表示する文言を変更
        print("MyClassA")   

class MyClassB(MyClass): # MyClassを継承

    def get(self): # get関数をオーバーライドして表示する文言を変更
        print("MyClassB")

class MyClassC(MyClass): # MyClassを継承

    def test(self): # get関数をオーバーライドしていない。MyClassのget関数が使われる
        print("for Test")


arr = [MyClassA(), MyClassB(), MyClassC()] # インスタンス化して、配列に代入

for a in arr: 
    a.get() # get()のコードは変えずに、代入するクラスによって機能を変えることができる

# 表示結果
# MyClassA
# MyClassB
# MyClass

ここで気づいて欲しい点は以下のふたつです。

  1. get()関数(メイン部分)は変えずに、代入しているクラス(アタッチメント部分)により機能を変えている。
  2. MyClassA,B,CはMyClassを継承しているため、必ずget関数を持っている。

クラスの継承を使うことにより、必ず同じ関数名が存在するようにしているのです(アタッチメントの接続部分が同じになるようにしている)。

抽象クラスやインターフェースについて

多様性について調べると、抽象クラスとインターフェースについても記載があると思います。 これは、上記の例で言えば、確実にget関数のコードを実装させるためのコーディング手法です。 多様性については使う機会も少ないと思いますので、抽象クラス、インターフェースについては説明を省略します。

まとめ

多様性の機能を使うことにより、以下の利点があります。

  1. 機能追加が容易にできる。メイン部分は変えずにアタッチメントを作るだけで、機能を多様化できる。

あまり使う機会がないかもしれませんが、他人のコードで使われていて理解しないといけない場合がありますので、 知識としては持っておきましょう。今回でオブジェクト指向についての説明を終わりにしようと思いましたが、 もうひとつだけ重要なことがありますので、おまけとしてもうひとつ記事を書こうと思っています。

今回の解説は以上になります。