关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。
想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。
3年前关闭。
Improve this question
这是我必须应对的设计挑战。
Base 的子类具有它自己的特定功能,这些功能未在 Base 中定义。
我需要设计一种方法,以便可以根据输入日期生成不同的子类实例。
输入数据Data
作为函数 FactoryMethod
的传入参数包含一些复杂的逻辑来确定要生成哪个子类。预先存在的设计(即下面列出的 FactoryMethod)的问题是客户端必须向下转换指向 base 的返回指针,以便调用仅在子类中定义的函数。这个方法在当前的设计中是有问题的 b/c,我们不知道在 FactoryMethod 内部创建了什么子类。我只能想到两种可能的解决方案
解决方案1>在base中引入一个类型,用于存储指向base的指针的类型信息。是否有一个很好的例子向我展示了最佳实践?
解决方案2>在FactoryMethod的实现中返回指向子类而不是基类的指针。再说一次,有没有一个很好的例子来炫耀这一点?
class Base {
public:
...
virtual void BaseFuncA() {}
};
class SubClassA : public Base {
public:
...
void SubClass_A_Func2() {}
}
class SubClassB : public Base {
public:
...
void SubClass_B_Func3() {}
}
Base* FactoryMethod(Data)
{
if (Data designed for SubClassA)
return new SubClassA
if (Data designed for SubClassB)
return new SubClassB
...
}
问题:
SubClassA
的客户必须向下转换才能调用子类函数SubClassA* ptr = dynamic_cast<SubClassA*> (pointer to Base*);
众所周知,如果您总是不得不处理代码中的向下转换,那么设计就有缺陷。
问题 > 有没有一本好书/资源可以让我找到解决这个问题的实用方法。换句话说,代码的客户端不必为了使用子类中定义的函数而向下转换指针。例如,工厂方法可能会返回子类指针,而不是采用 boost::variant?
BTW:把所有的功能都放到Base里面,在Base里面提供虚拟的实现是不现实的。即使您可以这样做,您也将无法在不向下转型的情况下获得子类提供的真正功能。
最佳答案
尝试阅读访问者模式以避免降级。希望能帮助到你。
http://en.wikipedia.org/wiki/Visitor_pattern
关于c++ - 返回指向子类的指针的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296076/