ダックタイピング

東方算程譚 - アヒル型

"If it walks like a duck and quacks like a duck, it must be a duck"
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)


つまり、継承とかしなくても、同じインターフェースを持ってるものならなんでも処理するということですね


まさにC++テンプレート

#include <iostream>

using namespace std;

struct sol {
    void roman_cancel() const { cout << "ソル" << endl; }
};

struct ky {
    void roman_cancel() const { cout << "カイ" << endl; }
};


// ロマキャン
template <class Character>
void roman_cancel(const Character& character)
{
    character.roman_cancel();
}


int main()
{
    roman_cancel(sol());
    roman_cancel(ky());
    return 0;
}

「ロマンキャンセルできるならギルティのキャラクターです」

C++はこれを静的に解決できます




以下Wikipediaからの引用

ダック・タイピング(duck typing)とは、SmalltalkPythonRubyなどのいくつかの
動的型付けオブジェクト指向プログラミング言語に特徴的な型付けの作法のことである。

それらの言語ではオブジェクト(変数の値)に何ができるかはオブジェクトそのものが決定する。

つまり、オブジェクトがあるインタフェースのすべてのメソッドを持っているならば、
たとえそのクラスがそのインタフェースを宣言的に実装していなくとも、
オブジェクトはそのインタフェースを実行時に実装しているとみなせるということである。

それはまた、同じインタフェースを実装するオブジェクト同士が、
それぞれどのような継承ヒエラルキーを持っているかとは関係なく、相互に交換可能であるという意味でもある。

この用語の名前は「ダック・テスト」に由来する。

"If it walks like a duck and quacks like a duck, it must be a duck"
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)


デーブ・トーマスはRubyコミュニティで初めてこの言葉を使ったと考えられている。


C++のtemplateはダック・タイピングの静的版である。
例えば、iteratorIterator基底クラスのようなものからメソッドを継承しているわけではない。


もう1つ、ダック・タイピングに似たアプローチにOCamlのstructural subtypingがある。
メソッドのシグネチャが互換ならば、宣言上の継承関係は関係なく、オブジェクトの型も互換であるというものである。
これはOCamlの型推論システムによってコンパイル時にすべて決定される。