ポリモーフィズム

確認済のバージョン: 4.1

-

難易度: 中級

継承クラス間にとても便利で動的な機能を作成するポリモーフィズム 、アップキャスト、ダウンキャストについて学びます。

ポリモーフィズム

中級 Scripting

Fruit Class

Code snippet

using UnityEngine;
using System.Collections;

public class Fruit 
{
    public Fruit()
    {
        Debug.Log("1st Fruit Constructor Called");
    }
    
    public void Chop()
    {
        Debug.Log("The fruit has been chopped.");     
    }
    
    public void SayHello()
    {
        Debug.Log("Hello, I am a fruit.");
    }
}
#pragma strict

public class Fruit 
{
    public function Fruit ()
    {
        Debug.Log("1st Fruit Constructor Called");
    }
    
    public function Chop ()
    {
        Debug.Log("The fruit has been chopped.");     
    }
    
    public function SayHello ()
    {
        Debug.Log("Hello, I am a fruit.");
    }
}
import UnityEngine
import System.Collections


public class Fruit:

    
    public def constructor():
        Debug.Log('1st Fruit Constructor Called')

    
    public def Chop():
        Debug.Log('The fruit has been chopped.')

    
    public def SayHello():
        Debug.Log('Hello, I am a fruit.')

Apple Class

Code snippet

using UnityEngine;
using System.Collections;

public class Apple : Fruit 
{
    public Apple()
    {
        Debug.Log("1st Apple Constructor Called");
    }
    
    //Apple クラスには独自の Chop() と SayHello() があります。
    //スクリプトを実行するときに、どのようなときに Fruit のこれらの
    //メソッドが呼び出され、どのようなときに  Apple のメソッドが
    //呼び出されるのかに気を付けてください。
    //この例では、キーワード "new" によって Unity からの警告を抑え、
    //Apple クラスでそれらのメソッドをオーバーライドしません。
    public new void Chop()
    {
        Debug.Log("The apple has been chopped.");     
    }
    
    public new void SayHello()
    {
        Debug.Log("Hello, I am an apple.");
    }
}
#pragma strict

public class Apple extends Fruit 
{
    public function Apple ()
    {
        Debug.Log("1st Apple Constructor Called");
    }
    
        //Apple クラスには独自の Chop() と SayHello() があります。
        //スクリプトを実行するときに、どのようなときに Fruit のこれらの
        //メソッドが呼び出され、どのようなときに  Apple のメソッドが
        //呼び出されるのかに気を付けてください。
        //この例では、キーワード "new" によって Unity からの警告を抑え、
        //Apple クラスでそれらのメソッドをオーバーライドしません。
    public function Chop ()
    {
        Debug.Log("The apple has been chopped.");     
    }
    
    public function SayHello ()
    {
        Debug.Log("Hello, I am an apple.");
    }
}
import UnityEngine
import System.Collections


public class Apple(Fruit):

    public def constructor():
        Debug.Log('1st Apple Constructor Called')

    
        //Apple クラスには独自の Chop() と SayHello() があります。
        //スクリプトを実行するときに、どのようなときに Fruit のこれらの
        //メソッドが呼び出され、どのようなときに  Apple のメソッドが
        //呼び出されるのかに気を付けてください。
        //この例では、キーワード "new" によって Unity からの警告を抑え、
        //Apple クラスでそれらのメソッドをオーバーライドしません。
    public new def Chop():
        Debug.Log('The apple has been chopped.')

    
    public new def SayHello():
        Debug.Log('Hello, I am an apple.')

FruitSalad Class

Code snippet

using UnityEngine;
using System.Collections;

public class FruitSalad : MonoBehaviour
{
    void Start () 
    {
                //ここでは、Fruit 型の変数 "myFruit" に、Apple への参照を
                //アサインすることに注目してください。これは、ポリモーフィズムゆえに有効です。
                //Apple クラスは Fruit クラスの子なので (is-a)、問題なく成り立ちます。
                //Apple への参照を Fruit 型の変数に格納する場合は
                //Apple への参照は Fruit 型のように扱われます。
        Fruit myFruit = new Apple();

        myFruit.SayHello();
        myFruit.Chop();
        
                //これは、ダウンキャストと呼ばれます。Fruit 型の変数 "myFruit" は、
                //実際は Apple への参照を格納しています。
                //ですから、問題なく Apple 型の変数に戻すことができます。
                //こうすることにより、以前は Fruit 型のように使用していた myFruit を
                //Apple 型として使用できます。
        Apple myApple = (Apple)myFruit;
        
        myApple.SayHello();
        myApple.Chop(); 
    }
}
#pragma strict

function Start () 
{
       //ここでは、Fruit 型の変数 "myFruit" に、Apple への参照を
       //アサインすることに注目してください。これは、ポリモーフィズムゆえに有効です。
       //Apple クラスは Fruit クラスの子なので (is-a)、問題なく成り立ちます。
       //Apple への参照を Fruit 型の変数に格納する場合は
       //Apple への参照は Fruit 型のように扱われます。
    var myFruit = new Apple();

    myFruit.SayHello();
    myFruit.Chop();
    
       //これは、ダウンキャストと呼ばれます。Fruit 型の変数 "myFruit" は、
       //実際は Apple への参照を格納しています。
       //ですから、問題なく Apple 型の変数に戻すことができます。
       //こうすることにより、以前は Fruit 型のように使用していた myFruit を
       //Apple 型として使用できます。
    var myApple = myFruit as Apple;
    
    myApple.SayHello();
    myApple.Chop(); 
}
import UnityEngine
import System.Collections


public class FruitSalad(MonoBehaviour):

    
    private def Start():
             //ここでは、Fruit 型の変数 "myFruit" に、Apple への参照を
             //アサインすることに注目してください。これは、ポリモーフィズムゆえに有効です。
             //Apple クラスは Fruit クラスの子なので (is-a)、問題なく成り立ちます。
             //Apple への参照を Fruit 型の変数に格納する場合は
             //Apple への参照は Fruit 型のように扱われます。
        myFruit as Fruit = Apple()
        
        myFruit.SayHello()
        myFruit.Chop()
        
                //これは、ダウンキャストと呼ばれます。Fruit 型の変数 "myFruit" は、
                //実際は Apple への参照を格納しています。
                //ですから、問題なく Apple 型の変数に戻すことができます。
                //こうすることにより、以前は Fruit 型のように使用していた myFruit を
                //Apple 型として使用できます。
        myApple = (myFruit cast Apple)
        
        myApple.SayHello()
        myApple.Chop()

関連するチュートリアル

関連ドキュメント