C ++のインターフェイスは、abstract-base-classes:少なくとも1つの純粋仮想関数を含むステートレスクラスとして作成するのが最適です。具象クラスは、インターフェイスクラスからパブリックに派生し、(オプションで)インターフェイスを実装するために状態を追加します。
class IFoo
{
public:
// enable deletion of implementation classes through IFoo*
virtual ~IFoo() {}
// interface
void bar()
{
// add optional pre-processing here
do_bar();
// add optional post-processing here
}
private:
// to be overridden by implementation classes
virtual void do_bar() = 0; // pure virtual
// no state here!
};
class FooImpl
:
public IFoo
{
public:
// constructors, assignment etc. to manipulate state
private:
virtual void do_bar()
{
// your implementation
}
// add your state here
};
void my_algorithm(IFoo* foo)
{
foo->bar();
}
int main()
{
IFoo* f = new FooImpl();
my_algorithm(f); // resolves to using FooImpl::do_bar()
return 0;
}
上記のコードは、実行時のポリモーフィズムと明示的なインターフェイスに関するものです。C ++には、コンパイル時のポリモーフィズムと暗黙的なインターフェイスを使用する代替手段があります。これは、テンプレートと不思議なことに繰り返されるテンプレートパターンを使用して行われます。
ここではNon-Virtual-Interface(NVI)イディオムを使用していることに注意してください。のパブリックインターフェイスIFoo
は非仮想であり、実装は(純粋な)仮想です。これにより、インターフェイスの作成者は、IFoo::bar()
クライアントに気付かれることなく、ログやその他のチェックを内部に追加するなど、より柔軟に対応できます。