ООП C ++: Какой шаблон: 2 класса с частично одинаковыми методами - PullRequest
0 голосов
/ 03 августа 2011

Описание проблемы:

Мне нужно реализовать 2 класса, например:

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

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

foo1 () и foo2 () имеют различную логику.
foo1 () и foo2 () могут иметь разные аргументы и возвращаемые значения.
общие методы одинаковы ИЛИ имеют похожую логику.

Цель: Для реализации фабрики, способной генерировать объекты А1 или А2.
После вызова factory :: create () использовать методы foo1 () или foo2 () соответственно типу создаваемого объекта.

Вопрос Как лучше реализовать такую ​​логику в C ++ C ++ / CLI?

СПАСИБО!

Ответы [ 4 ]

2 голосов
/ 03 августа 2011

Я думаю, что это определенно стандартная модель наследования.Создайте базовый класс Parent, который реализует common_method1 и common_method2.Создайте классы A1 и A2, которые наследуются от Parent.

Если вам нужно создать какой-то особый регистр в одном из методов common_method1 или common_method2 в A1 или A2, сделайте методы virtual в Parent.

Реализуйте foo1 и foo2 соответственно A1 и A2.

РЕДАКТИРОВАТЬ: Если я вас правильно понимаюВы хотите создать фабрику, которая возвращает ссылку на тип Parent (абстрактный класс).Если вы хотите всегда foo1 для A1 объектов и foo2 для A2 объектов, просто создайте виртуальный метод bar в интерфейсе Parent, который при переопределении в A1 просто вызоветfoo1, и, переопределенный в A2, просто вызовет foo2.

2 голосов
/ 03 августа 2011

Я бы создал базовый класс, который реализует общую функциональность. Затем используйте наследование для создания ваших окончательных классов.

Ваша фабрика может вернуть указатель на базовый класс, который может включать методы для определения типа. Или вы можете напечатать приведение, если это необходимо.

0 голосов
/ 03 августа 2011

Возможно, вы захотите иметь иерархию как таковую:

#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 здесь ближе к концу; не очень хорошая практика, но вам может понадобиться знать, как сделать это base-> производное преобразование

0 голосов
/ 03 августа 2011

Не зная больше о вашем примере, я думаю, вы захотите создать мастер-класс, содержащий общие методы, а затем наследовать их нескольким базовым классам.Затем вы можете использовать полиморфизм для вызова foo1 () или foo2 ().Этот сайт о полиморфизме может помочь вам, так как он использует классический пример круга / квадрата draw ().

...