免責事項: 私がやろうとしていることを正確に説明することはできませんでした。そのため、例が私の説明よりも明確になることを願っています! より明確にするために、言い直しを提案してください。:)
そのインターフェイスのメソッドのパラメーターのサブクラスを一般的なケースとは別に処理するために、インターフェイスで必要なバージョンよりも具体的なバージョンで関数をオーバーライドすることは可能ですか? (以下の例とより良い説明...)直接実行できない場合、同様の効果を達成するために使用できるパターンはありますか?
例
#include <iostream>
class BaseNode {};
class DerivedNode : public BaseNode {};
class NodeProcessingInterface
{
public:
virtual void processNode(BaseNode* node) = 0;
};
class MyNodeProcessor : public NodeProcessingInterface
{
public:
virtual void processNode(BaseNode* node)
{
std::cout << "Processing a node." << std::endl;
}
virtual void processNode(DerivedNode* node)
{
std::cout << "Special processing for a DerivedNode." << std::endl;
}
};
int main()
{
BaseNode* bn = new BaseNode();
DerivedNode* dn = new DerivedNode();
NodeProcessingInterface* processor = new MyNodeProcessor();
// Calls MyNodeProcessor::processNode(BaseNode) as expected.
processor->processNode(bn);
// Calls MyNodeProcessor::processNode(BaseNode).
// I would like this to call MyNodeProcessor::processNode(DerivedNode).
processor->processNode(dn);
delete bn;
delete dn;
delete processor;
return 0;
}
私のモチベーション
いくつかの異なる具体的な s を実装できるようにしたいと考えていますNodeProcessor
。そのうちのいくつかはすべてのノードを同じように扱い (つまり、インターフェイスに表示されているものだけを実装します)、いくつかは異なるタイプのノードを区別します (のようにMyNodeProcessor
)。したがって、インターフェイス メソッド (の一部/サブクラス) をオーバーロードすることにより、2 番目の呼び出しprocessNode(dn)
で実装を使用したいと思います。MyNodeProcessor::processNode(DerivedNode)
それは可能ですか?
明らかにprocessor
、タイプを変更するとMyNodeProcessor*
、これは期待どおりに機能しますが、異なるノード プロセッサを交換可能に使用できるようにする必要があります。
processNode(BaseNode)
実行時に引数の正確な型をチェックし、それに基づいて分岐する単一のメソッドを用意することで、これを回避することもできます。このチェックを自分のコードに含めるのは、私には洗練されていないように思えます (特に、ノード タイプの数が増え、巨大な switch ステートメントがある場合)。言語が助けになるべきだと思います。
私はC++を使用していますが、必要に応じて(または他の言語でこれがより簡単/異なる場合)、一般的な回答にも興味があります。