機能的に同一なのは、コールバックを使用してクラスの動作をカスタマイズすることと、仮想関数と継承を使用することです。しかし、私自身の作業では、関数オブジェクトを使用する方が少し柔軟であることがわかりました。
継承と多くのクラスを使用して動作をカスタマイズする
class Animal
{
virtual void onTouch() = 0 ;
} ;
class Dog : public Animal
{
void onTouch()
{
// all dogs behave this way.
// to change I'd need to subclass, or add parameters.
puts( "Woof" ) ;
}
} ;
関数オブジェクトを使用してインスタンスごとにクラスの動作をカスタマイズする
struct Animal
{
function<void ()> onTouch ;
} ;
Animal dog1,dog2 ;
dog1.onTouch = dog2.onTouch = [](){
puts( "Woof" ) ;
} ;
Animal dog3 ;
dog3.onTouch = [](){
// slightly modified behavior from dog1 and dog2, without
// having to subclass, add members, or pass extra parameters
puts( "Arr.. Woof" ) ;
} ;
私がここでやっていることの名前、またはこれを使用しない理由を知っている人はいますか