我有一些繁琐的类,我想重构它以用子类替换类型代码。在这个过程中的某个时刻,我有以下层次结构:
// interface
ISomeClass(){
public:
virtual foo() = 0;
virtual ~ISomeClass();
}
// this class is cumbersome one with huge amount of conditional logic based on type
BaseSomeClass : public ISomeClass(){
public:
virtual foo(){
if(TYPE_0 == getType()){ // finally I want to move such conditional logic in subclass
doSmth();
} else if (TYPE_1 == getType()){
doAnother();
}
}
protected:
virtual int getType(){ // I temporary need it for refactoring issue
return type_; // to replace type_ with subclasses
}
private:
int type_;
};
// this classes is almost empty now, but I want to move there all conditional logic in future
class Implementation1 : public BaseSomeClass {
virtual int getType(){ // I temporary need it for refactoring issue
return TYPE_0; // to replace type_ with subclasses
}
};
class Implementation2 : public BaseSomeClass {
virtual int getType(){ // I temporary need it for refactoring issue
return TYPE_1; // to replace type_ with subclasses
}
};
在BaseSomeClass
中定义了额外的虚拟方法getType()
。如果我使用某种接口ISomeClass
指针处理所有实例,这种方法行为会是多态的吗?假设界面本身并不提供这种虚拟方法。 请注意此代码是重构的第一步,而不是最后一步。这也是一个简化的例子,真正的代码有几十个这样的方法,我需要一步一步地进行重构。问题是关于C ++动态多态性。
答案 0 :(得分:4)
你问:
如果我使用某种接口
ISomeClass
指针处理所有实例,这种方法行为会是多态的吗?假设接口本身不提供这样的虚拟方法。
如果界面没有提供这样的虚拟方法,则不能指望多态行为。
最好在foo
和Implementation1
中实施Implementation2
。
class BaseSomeClass : public ISomeClass()
{
};
class Implementation1 : public BaseSomeClass
{
virtual void foo()
{
doSmth();
}
};
class Implementation2 : public BaseSomeClass
{
virtual void foo()
{
doAnother();
}
};
如果必须使用getType()
,则可以采用基于模板的多态行为。
template <typename D>
class BaseSomeClass : public ISomeClass()
{
public:
virtual foo()
{
int type = D::getType();
if(TYPE_0 == type)
{
doSmth();
}
else if (TYPE_1 == type)
{
doAnother();
}
}
};
此处,您希望D
提供界面getType()
。您可能希望D
提供接口foo
。
template <typename D>
class BaseSomeClass : public ISomeClass()
{
public:
virtual void foo()
{
D::foo():
}
};