...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

polymorphism vs duck typing (3)

http://d.hatena.ne.jp/haru-s/20070614/1181841613 の続きというか関連.

C++ で多態(polymorphism)を実現する方法はたくさんある。


昔は継承で実現するのが一般的だったが、最近は
委譲が推奨されている。そこで、以下のコードを書いてみた。
おそらくその筋の人からみれば当たり前だと思うけど。

きまぐれ日記: C++ で多態

何の変哲もないコードをD言語で書いてみた.

import std.stdio;

class Dog
{
    void bark()
    {
        writefln("wan!wan!");
    }
}
class Cat
{
    void bark()
    {
        writefln("nyan!nyan!");
    }
}

interface IAnimal
{
    void bark();
}

class Animal(T) : IAnimal
{
    private T animal;
    this()
    {
        animal = new T;
    }
    void bark()
    {
        animal.bark();
    }
}

void bark(AnimalT)(AnimalT animal)
{
    animal.bark();
}

void main()
{
    // 普通に呼び出し
    auto dog = new Animal!(Dog);
    auto cat = new Animal!(Cat);
    dog.bark();
    cat.bark();
    
    // polymorphism っぽい振る舞い
    IAnimal animal = dog;
    animal.bark(); // interface 経由で呼び出し
    animal = cat; // 付け替え
    animal.bark(); // interface 経由で呼び出し
    
    // duck typing っぽい振る舞い
    bark(dog);
    bark(cat);
}

こういうやり方があることは知っていたけど,実際に自分で書いてみるのは初めて.
なんか面白いな,これ.
もっと使っていくべきか.

追記

ちょくちょく書き直してます(^^;
duck typing っぽい振る舞いとか.