ネタ元 → Interfaceが使いこなせない。
interfaceは"責務の集合"に名前(カテゴリ)を与えるものですな。
利用者視点ではその名を冠するものが"~できる"ことが約束されており、
実装者視点ではその名を冠するかぎり"~できる"ことを保証せにゃなりません。
作るひとと使うひとの間の契約とでも申しましょうか。
Java/.NETにはinterfaceがありますけども、C++にはありません。
C++は多重継承があるから、純粋仮想関数だけで構成された
classをinterfaceの代わりに用いたりします。
てゆっかー、多重継承のできないJava/.NETが多重継承のかわりに
用意した、って雰囲気なんですけども。
# Java/.NETはinterfaceならいくつも継承(実装)できますからね
C++ではtemplateを使ったダック・タイピングって手法があります。
"鴨とはなにか"(=interface:鴨は~できる)が明確に定義されてなくたって、
鴨のようにふるまうならそいつぁ鴨とみなしていぃじゃない、
ってリクツです。
#include <iostream>
using namespace std;
// トランプの場札
struct CardDeck {
void draw() { cout << "カードを一枚引く\n"; }
};
// 預金口座
struct Account {
void draw() { cout << "預金を引き出す\n"; }
};
// 製図器
struct Drafter {
void draw() { cout << "図面を描く\n"; }
};
// ...に対し draw する: drawできるならDrawableとみなしていいじゃない
template<typename Drawable>
void draw_by(Drawable& target) {
target.draw();
}
int main() {
draw_by(CardDeck());
draw_by(Account());
draw_by(Drafter());
}
トランプの場札、預金口座、製図器に共通の基底クラス(=interface)はありません。
が、どれもdrawできるんだからDrawableとみなすわけや。