Лучший способ структурирования методов для обработки производных типов - PullRequest
0 голосов
/ 24 февраля 2010

У меня есть иерархия наследования, аналогичная приведенной ниже, и я хочу написать свой DAL для сохранения этих объектов, но не уверен, как лучше его структурировать?

  • Домашнее животное <- Собака <- Эльзас и Лабрадор </li>
  • Домашнее животное <- Кошка <- Персидский и Полосатый </li>

Хотя все классы наследуются от Pet, каждый метод должен будет вызывать свою хранимую процедуру и добавлять разные параметры sql. Там будут некоторые общие параметры, хотя.

Несколько идей:

(1) PetDal с перегруженным методом сохранения, который принимает каждый производный тип.

(2) PetDal с отдельными методами SaveLabrador, SaveTabby.

(3) Базовые классы PetDal плюс унаследованные классы LabradorDal, TabbyDal, по одному на каждый тип с общим интерфейсом. например, void Save (Pet pet), который должен приводить питомца к производному типу в каждом методе (метод стратегии).

(4) Другим способом.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2010

(1) и (2) действительно одинаковы, только синтаксически различны. Одна из проблем с (4) состоит в том, что если вы хотите работать с различными постоянными типами (плоские файлы, базы данных и т. Д.), Вам потребуется класс для каждой перестановки (AlsationToFileDAL, AlsationToSybaseDAL и т. Д.).

Вы можете использовать (1) / (2) с двойной отправкой, например ::100100

// pets.h

#include <string>
#include <iostream>

class Alsation;
class Persian;

class PetDAL
{
public:
    virtual ~PetDAL () {}

    virtual void save (const Alsation* alsation) = 0;
    virtual void save (const Persian* persian) = 0;
};

class Pet
{
    std::string name_;

public:
    Pet (const std::string& name) : name_ (name)
    {}

    virtual ~Pet () {}

    std::string getName () const
    {
        return name_;
    }

    virtual void save (PetDAL* dal) const = 0;
};

class Dog : public Pet
{
    bool sleepWalks_;
public:
    Dog (const std::string& name, bool sleepWalks) : Pet (name), sleepWalks_ (sleepWalks)
    {}

    bool getSleepWalks () const {return sleepWalks_;}

};

class Alsation : public Dog
{
public:
    Alsation (const std::string& name, bool sleepWalks) : Dog (name, sleepWalks)
    {}

    virtual void save (PetDAL* dal) const
    {
        dal->save (this);
    }
};

class Cat : public Pet
{
    int purrsPerMinute_;

public:
    Cat (const std::string& name, int purrsPerMinute) : Pet (name), purrsPerMinute_ (purrsPerMinute)
    {}

    int getPurrsPerMinute () const {return purrsPerMinute_;}
};

class Persian : public Cat
{
public:
    Persian (const std::string& name, int purrsPerMinute) : Cat (name, purrsPerMinute)
    {}

    virtual void save (PetDAL* dal) const
    {
        dal->save (this);
    }
};

class PetDALCoutImpl : public PetDAL
{
public:
    virtual void save (const Alsation* alsation)
    {
        std::cout << "Saving alsation " << std::endl
            << "\tname=" << alsation->getName () << std::endl
            << "\tsleepwalks=" << alsation->getSleepWalks () << std::endl;
    }

    virtual void save (const Persian* persian)
    {
        std::cout << "Saving persian " << std::endl
            << "\tname=" << persian->getName () << std::endl
            << "\tpurrsPerMinute=" << persian->getPurrsPerMinute () << std::endl;
    }
};

int test (int argc, char* argv[])
{
    Dog* dog = new Alsation ("fido", true);
    Cat* cat = new Persian ("dave", 10);

    PetDAL* petDAL = new PetDALCoutImpl ();

    dog->save (petDAL);
    cat->save (petDAL);

    delete cat;
    delete dog;

    return 0;
};

т.е. базовый класс Pet знает, что его подклассы могут быть сохранены в DAL, но он не зависит от реализаций DAL.

0 голосов
/ 24 февраля 2010

Задумывались ли вы об использовании шаблона, подобного шаблону стратегии ? Это может соответствовать вашим потребностям, поскольку у вас могут быть разные стратегии для разных реализаций, при этом все еще используются свойства / методы из абстрактного класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...