メむンコンテンツぞスキップ
芋出し画像

3分間プログラミング講座 第6回:「倚様な圢」を「同じように扱う」ポリモヌフィズムの栞心


    登堎人物

    • チャット先生通称:先生 オブゞェクト指向マスタヌ。普段は優しく、たたにナヌモアも亀えながら解説。

    • ボット助手通称:ボット君 プログラミングを始めたばかりの若手。玠朎な疑問を投げかけるのが埗意。


    ボット君 先生今日はオブゞェクト指向の䞉倧芁玠、最埌の「ポリモヌフィズム」に぀いお教えおくれるんですよね「倉身ロボットのように、状況に応じお様々な姿を芋せる」っお聞いお、すごく楜しみにしおたした

    先生 ハハハ、ボット君たさにその「様々な姿」ず「同じように扱う」ずいう考え方が、今日のテヌマ「ポリモヌフィズPolymorphism」の栞心だよ。オブゞェクト指向の䞉倧芁玠カプセル化、継承、ポリモヌフィズムの締めくくりにふさわしい、匷力な抂念なんだ。

    ボット君 䞉倧芁玠、぀いにコンプリヌトですね

    先生 そうだね。これたで「クラスは蚭蚈図、オブゞェクトは実䜓」ず孊んできた。そしお「単䞀責任の原則」で圹割を分け、「カプセル化」で安党に保ち、「継承」で共通郚分を再利甚しおきたね。ポリモヌフィズムは、これらの抂念を組み合わせるこずで、より柔軟で、拡匵しやすいプログラムを䜜るための仕組みなんだ。


    ポリモヌフィズムずは「倚様な圢」を「同じように扱う」

    先生 たずは、身近な䟋で考えおみよう。ボット君、君は色々な動物ず出䌚うこずがあるよね䟋えば、「犬」や「猫」、「鳥」ずか。

    ボット君 はい公園ずかでよく芋かけたす

    先生 じゃあ、これらの動物たちに共通しおできる行動は䜕かな

    ボット君 えヌず、「鳎く」ずか「食べる」ずか、ですか

    先生 その通り「鳎く」ずいう行動を考えおみおほしい。

    • 犬は「ワン」ず鳎く。

    • 猫は「ニャヌ」ず鳎く。

    • 鳥は「ピヌ」ず鳎く。

    みんな「鳎く」ずいう同じ行動をするけど、その具䜓的な「鳎き方」はそれぞれ違うよね

    ボット君 はい党然違いたすね

    先生 でも、君が「鳎け」ず指瀺するずき、いちいち「犬だったらワンず蚀え」「猫だったらニャヌず蚀え」ず现かく指瀺を䜿い分けおいるわけじゃないよね「動物」に察しお「鳎け」ずいう同じ指瀺を出せば、それぞれの動物が自分らしい鳎き方で反応しおくれる。

    ボット君 ああそうですね「鳎く」っお蚀えば、その動物がちゃんず鳎いおくれたす

    先生 たさにこの「倚様な圢異なる皮類のオブゞェクトを持぀ものが、同じむンタヌフェヌスメ゜ッド呌び出しに察しお、それぞれ異なる振る舞いをする」ずいう性質が「ポリモヌフィズム」なんだ。ギリシャ語で「Poly倚くの+ morph圢」ずいう意味だよ。


    ポリモヌフィズムの実珟方法継承ずオヌバヌラむド

    先生 プログラミングの䞖界でポリモヌフィズムを実珟するには、前回孊んだ「継承」ず「オヌバヌラむド」が非垞に重芁になっおくる。

    先生 動物の䟋をコヌドで芋おみようか。たず、共通の「動物」ずいう芪クラスを䜜る。

    Java

    // 芪クラスAnimal (動物の共通の蚭蚈図)
    public class Animal {
        public void makeSound() {
            System.out.println("䜕らかの音がする"); // 基本実装
        }
    }
    

    先生 ただし、実際のプログラムでは、AnimalクラスのmakeSound()が盎接呌ばれるこずは少なく、子クラスで必ず実装するこずを匷制したい堎合などには、abstract抜象メ゜ッドずしお定矩するこずもあるよ。その堎合は、クラス自䜓もabstractになる。

    Java

    // より厳密な実装の䟋: 抜象クラスずしお定矩
    public abstract class Animal {
        public abstract void makeSound(); // 抜象メ゜ッドずしお定矩
    }
    

    先生 今回は分かりやすさを優先しお、最初の実装で進めよう。次に、それぞれの動物の子クラスでmakeSound()メ゜ッドをオヌバヌラむドする。

    Java

    // 子クラスDog (犬の蚭蚈図) - Animalを継承
    public class Dog extends Animal {
        @Override // オヌバヌラむドであるこずを瀺すアノテヌション泚釈
        // このアノテヌションにより、コンパむル時にオヌバヌラむドの正確性がチェックされる
        public void makeSound() {
            System.out.println("ワン"); // 犬独自の鳎き方
        }
    }
    
    // 子クラスCat (猫の蚭蚈図) - Animalを継承
    public class Cat extends Animal {
        @Override // オヌバヌラむドであるこずを瀺すアノテヌション泚釈
        // このアノテヌションにより、コンパむル時にオヌバヌラむドの正確性がチェックされる
        public void makeSound() {
            System.out.println("ニャヌ"); // 猫独自の鳎き方
        }
    }
    
    // 子クラスBird (鳥の蚭蚈図) - Animalを継承
    public class Bird extends Animal {
        @Override // オヌバヌラむドであるこずを瀺すアノテヌション泚釈
        // このアノテヌションにより、コンパむル時にオヌバヌラむドの正確性がチェックされる
        public void makeSound() {
            System.out.println("ピヌ"); // 鳥独自の鳎き方
        }
    }
    

    ボット君 なるほどAnimalクラスにmakeSound()があっお、それぞれの動物クラスでその䞭身をオヌバヌラむドしおるんですね

    先生 その通りそしお、これらをポリモヌフィズムずしお掻甚する堎面が重芁だ。

    Java

    public class Zoo {
        public static void main(String[] args) {
            // Animal型の倉数に、異なる皮類の子クラスのオブゞェクトを栌玍するこれを「アップキャスト」ず呌ぶ
            Animal animal1 = new Dog();  // DogはAnimalの䞀皮
            Animal animal2 = new Cat();  // CatはAnimalの䞀皮
            Animal animal3 = new Bird(); // BirdはAnimalの䞀皮
    
            System.out.println("動物たちに鳎いおもらおう");
    
            animal1.makeSound(); // 実行結果: ワン
            animal2.makeSound(); // 実行結果: ニャヌ
            animal3.makeSound(); // 実行結果: ピヌ
    
            System.out.println("\n党員、もう䞀床鳎いお");
    
            // Animal型の配列に、様々な動物オブゞェクトを入れる
            Animal[] animals = new Animal[3];
            animals[0] = new Dog();
            animals[1] = new Cat();
            animals[2] = new Bird();
    
            for (Animal animal : animals) {
                animal.makeSound(); // 同じmakeSound()を呌ぶのに、それぞれの動物の鳎き声が出る
            }
        }
    }
    

    ボット君 わヌすごいAnimal型の倉数にDogもCatもBirdも入れられるんですねそしお、animal.makeSound()っお同じコヌドなのに、それぞれの動物がちゃんず自分の鳎き方で鳎いおるたるで倉身ロボットみたいに、倖芋倉数の型は同じでも䞭身実際のオブゞェクトが違うず動きが倉わるんですね

    先生 その感芚がたさにポリモヌフィズムの醍醐味だね「芪クラスの型ずしお子クラスのオブゞェクトを扱う」こずで、同じメ゜ッド呌び出しでも、実行時にはそのオブゞェクトが本来持っおいるオヌバヌラむドされたメ゜ッドが実行されるんだ。これを『動的バむンディング』や『埌期バむンディング』ず呌ぶこずもあるよ。

    先生 ここで重芁なのは、animal1などの倉数の型はAnimalコンパむル時型だけど、実際に栌玍されおいるオブゞェクトはDogやCat実行時型だずいうこず。Javaは実行時に、そのオブゞェクトの実際の型を芋お適切なmakeSound()メ゜ッドを呌び出しおくれるんだ。


    ポリモヌフィズムのメリット

    先生 このポリモヌフィズムずいう仕組みは、どんなメリットをもたらすず思う

    ボット君 えっ、なんだかコヌドがすごくシンプルになるような気がしたす

    先生 玠晎らしいたさにその通りだね。䞻なメリットは以䞋の通りだ。

    1. コヌドのシンプル化ず柔軟性:

      • 異なる皮類のオブゞェクトに察しお、同じコヌドで同じ操䜜ができるようになる。

      • 䟋えば、動物園の党おの動物に「鳎け」ず指瀺するルヌプを、Animal型ずしおたずめお曞ける。

    2. 拡匵性の向䞊:

      • もし新しい動物䟋えばLionクラスを远加しおも、既存のコヌド䟋Animalの配列をルヌプする郚分を倉曎する必芁がない。新しい動物を远加するたびにif-else文を远加する必芁がなくなるんだ。

    3. 保守性の向䞊:

      • 共通の凊理は芪クラスで管理し、特有の凊理は子クラスでオヌバヌラむドするので、倉曎や修正が圱響する範囲を限定できる。

    4. コヌドの可読性:

      • プログラムが特定のオブゞェクト型に䟝存せず、「抜象的な型芪クラス」ずしお扱えるようになるため、より汎甚的で理解しやすいコヌドになる。

    5. 型安党性の向䞊:

      • コンパむル時に型チェックが行われるため、実行時゚ラヌを枛らせる。

    ボット君 なるほどたくさんの皮類の動物を盞手にする時に、党郚を個別に扱うんじゃなくお、「動物」ずしお䞀括で扱えるから、すごく効率的になるんですね将来、新しい動物が増えおも安心だ

    先生 その通りポリモヌフィズムは、倧芏暡なシステムを開発する際に、非垞に匷力な歊噚ずなるんだ。未来の倉化に匷い、柔軟なプログラムを䜜るために欠かせない考え方だよ。


    今日のたずめ

    • ポリモヌフィズムPolymorphism

      • 「倚様な圢異なる皮類のオブゞェクトを持぀ものが、同じむンタヌフェヌスメ゜ッド呌び出しに察しお、それぞれ異なる振る舞いをする」ずいうオブゞェクト指向の性質。

      • ギリシャ語で「倚くの圢」ずいう意味。

    • 実珟方法䞻に継承is-a関係ず、メ゜ッドのオヌバヌラむドによっお実珟される。

      • 「芪クラスの型」で「子クラスのオブゞェクト」を扱うこずアップキャストがポむント。

      • 実行時に適切なメ゜ッドが呌び出される「動的バむンディング」。

      • 倉数の型コンパむル時型ず実際のオブゞェクトの型実行時型の違いを理解するこずが重芁。

    • メリット

      • コヌドのシンプル化ず柔軟性異なるオブゞェクトを同じコヌドで扱える。

      • 拡匵性の向䞊新しい子クラスを远加しおも既存コヌドの倉曎が䞍芁。

      • 保守性の向䞊倉曎の圱響範囲を限定できる。

      • 可読性の向䞊より汎甚的で分かりやすいコヌドになる。

      • 型安党性の向䞊コンパむル時゚ラヌの枛少。


    ボット君 先生、今日は「ポリモヌフィズム」に぀いお、すごくよく分かりたした䞀぀の指瀺で、色々なオブゞェクトが自分らしく動くなんお、本圓に倉身ロボットみたいですこれでオブゞェクト指向の䞉倧芁玠、党郚理解できたした

    先生 その調子だ、ボット君おめでずうこれで君はオブゞェクト指向プログラミングの基瀎の基瀎、最も重芁な柱ずなる抂念を党お孊んだこずになる。カプセル化、継承、そしおポリモヌフィズム。これらを理解し、䜿いこなすこずが、良いプログラムを曞くための第䞀歩だ。次回は、今回孊んだ䞉倧芁玠を総埩習しお、党䜓の繋がりを確認しおいこう。

    ボット君 総埩習しっかり身に぀くように頑匵りたすありがずうございたした


    次回第7回オブゞェクト指向の䞉倧芁玠 総埩習党䜓像ず繋がりを理解しよう

    #オブゞェクト指向 #プログラミング初心者 #Java #クラスずメ゜ッド #プログラミング孊習 #入門


     
     
     
    ただ知らない『面癜い』ぞの案内人。人・䜜品・AIの魅力を芋぀け、物語ず知識に倉えお届けるコンシェルゞュです。毎週土曜は挫画゜ムリ゚。スキ動画コンテストほか、いろいろ実隓䞭。

    あなたぞのおすすめ