C ++ использует черты, как в PHP - PullRequest
0 голосов
/ 04 июля 2018

Я ищу решение, как я могу определить повторно используемый код в C ++, как признаки в PHP.

Описание проблемы: У меня есть три класса (Class, Customer, Admin), и каждый класс должен иногда выполнять одно и то же действие, такое как вставка нового дочернего элемента, добавление нового адреса или добавление нового класса (то же самое с действием update и remove). Я хочу избегать слишком развивать эти функции в каждом классе снова.

Далее мне было бы очень приятно, если бы эти функции были отделены от класса "имя_продукта". Я не хочу записывать все эти функции в класс "product_name" или "product", потому что в противном случае класс становится слишком запутанным для слишком большого количества функций.

Редактировать
Имя класса «product_name» является заполнителем для моего продукта. На данный момент я не знаю название моего продукта :). И родительский класс «product» является точкой сбора для всех продуктов, которые я хотел бы разработать в будущем. Я создал этот класс, потому что я хочу использовать Single-Sign-On и одну и ту же базу данных пользователей ... Поэтому я должен разработать эти части только один раз!

Диаграмма классов моего желания: enter image description here

1 Ответ

0 голосов
/ 04 июля 2018

C ++ отличается от PHP во многих аспектах. Вот как вы можете создать свой DAO на основе домена в C ++.

В этом примере для подключения к базе данных используется библиотека POCO . Вы можете использовать любую другую библиотеку для того же предложения.

enum class Role {
   ADMIN,
   CUSTOMER,
   SCHOOL_ACCOUNT
}

class User {
protected:
  constexpr User(Role role) noexcept:
    role_(role)
  {}
public:
  User(const User&) = delete;
  User& operator=(const User&) = delete; 
  Role role() const noexcept {
   return role_;
  }
  virtual const char* id() const = 0;
  virtual ~User() = 0;
private:
  Role role_;
};

User::~User() 
{} 

class MyIDGenerator {
public:
  static std::string generate() {
    static POCO::UUIDGenerator gen;
    return gen.create().toString();
  }
};

class Customer final: public User  { 
public:
    Customer() noexcept:
       User(Role.CUSTOMER),
       id_(  MyIDGenerator::generate() ) 
    {} 
    virtual const char* id() const override
    {
      return id_.data();
    }
    virtual ~Customer() override
    {}
private:
   std::string id_;
}
...
// define your Admin and School
...
class Product {
 public:
 Product():
   id_( MyIDGenerator::generate() )
 {} 
 void insertUser(const User* user, const Poco::Data::Session& session) {
  // execute your SQL hire i.e. something like
  POCO::Data::Statement insert(session);
  insert << "insert into product_allowed_user values(?,?) << use(id_) << use(user->id());
  insert.execute(); 
 }
 private:
   std::string id_;
}
...