OOP C ++:哪种模式:2个类具有部分相同的方法

时间:2011-08-03 06:53:40

标签: c++ oop inheritance design-patterns factory

问题描述:

我需要实现以下两个类:

class A1 {
 common_method1();
 common_method2();
 foo1();
};

class A2 {
 common_method1();
 common_method2();
 foo2();
};

foo1()和foo2()有不同的逻辑 foo1()和foo2()可能具有不同的参数和返回值 常用方法相同或具有相似的逻辑。

:定位: 实现能够生成A1或A2对象的工厂 调用factory :: create()后分别使用foo1()或foo2()方法生成对象的类型。

问题 如何在C ++ C ++ / CLI中实现这样的逻辑呢?

谢谢!

4 个答案:

答案 0 :(得分:2)

我会创建一个实现常用功能的基类。然后使用继承来创建最终的类。

您的工厂可以返回指向基类的指针,该指针可以包含确定类型的方法。或者你可以根据需要输入它。

答案 1 :(得分:2)

我认为这绝对是一种标准的继承模式。创建一个基类Parent,它实现common_method1common_method2。创建继承自A1

的类A2Parent

如果您需要在common_method1common_method2中的某个A1A2方法中执行一些特殊的大小写,请创建方法virtual Parent

分别foo1foo2实施A1A2

编辑:如果我理解正确,你想创建一个返回Parent类型引用(抽象类)的工厂。如果您希望始终foo1 A1个对象和foo2 A2个对象,只需在bar界面中创建虚拟方法Parent ,在A1中覆盖,只需拨打foo1,并在A2中覆盖,只需拨打foo2

答案 2 :(得分:0)

我不了解你的例子,我想你会想要创建一个包含常用方法的主类,然后将它们继承到几个基类。 然后你可以使用多态来调用foo1()或foo2()。 polymorphism上的此网站可能对您有所帮助,因为它使用的是经典的圆形/方形绘制()示例。

答案 3 :(得分:0)

您可能希望拥有一个层次结构:

#include <iostream>

struct A_Base {
    // You can put your other common method here
    virtual void common_method();
    virtual ~A_Base();
}

struct A1 : A_Base {
    void foo1();
};

struct A2 : A_Base {
    void foo2();
};

struct Factory {
    // I'm just using an int for the condition,
    // but you can use anything
    A_Base *CreateA(int i) {
        if( i == 1 ) return new A1;
        if( i == 2 ) return new A2;
    }
};

int main() 
{
    Factory f;

    // Create an object
    A_Base *pb = f.CreateA(1);

    A1 *pa1;
    A2 *pa2;

    // Run a common method
    pb->common_method();

    // Check the runtime type
    // (not really necessary, but you might need it)
    if( pa1 = dynamic_cast<A1*>(pb) ) {
        pa1->foo1(); // Run the unique method
    } else if ( pa2 = dynamic_cast<A2*>(pb) ) {
        pa2->foo2(); // Or run the other unique method
    }

    // Delete the pointer
    delete pb;
    return 0;
}

是的,我在这附近使用RTTI;不是很好的练习,但您可能需要知道如何进行基础 - >衍生转换