私はこの質問にほぼ正確にここに来ました。問題は、基本的には、e
の動的型がExplosionEvent *
であっても、handle (ExplosionEvent *e)
のような関数は、e
の静的型を受け入れないようにすることが問題です。それは素晴らしい機能ですが、それ以外の言語で何を変えなければならないかはわかりません。
Visitorパターンは、私が考えることができる最もクリーンなソリューションです。欠点は、それが冗長であり、dynamic_cast<>
より安くない可能性があるということです。
Main.hpp:
#include <iostream>
class Event;
class Handler;
#include "Event.hpp"
#include "Handler.hpp"
イベント。HPP:
#ifndef EVENT_H
#define EVENT_H
class Event
{
public:
virtual void accept (Handler *handler) { }
};
class ExplosionEvent : public Event
{
void accept (Handler *handler);
};
#endif // !EVENT_H
Event.cpp:
#include "Main.hpp"
void
ExplosionEvent::accept (Handler *handler)
{
handler->handleExplosion (this);
}
Handler.hpp:
#ifndef HANDLER_H
#define HANDLER_H
class Handler
{
public:
void handle (Event *event) { event->accept (this); }
virtual void handleExplosion (ExplosionEvent *explosionEvent) { }
};
class ExplosionHandler : public Handler
{
void handleExplosion (ExplosionEvent *explosionEvent);
};
#endif // !HANDLER_H
Handler.cpp:
#include "Main.hpp"
void
ExplosionHandler::handleExplosion (ExplosionEvent *explosionEvent)
{
std::cout << "BOOM!" << std::endl;
}
main.cppに:
#include "Main.hpp"
int
main (int argc, char *args)
{
Event *event = new ExplosionEvent;
Handler *handler = new ExplosionHandler;
handler->handle (event);
}
コンパイルして実行します。
$ g++ -o boom *.cpp
$ ./boom
BOOM!
$
私がすでに説明した第2のアプローチをすでに使用していましたが、私は実際にこの解決策が好きです。私が見ることができる唯一の問題は、ハンドラの多くのシステムではハンドラ内の空の機能は、おそらくかなり多く呼び出されるだろうということです。 – f4st