【发布时间】:2020-12-09 18:58:46
【问题描述】:
我有一个“数据库”类,它有一个存储用户的地图。还有一个“Auth”类继承自“Database”并获取用户映射,以便在授权期间找到正确的用户。还有“Admin”类,同样继承自“Database”,可以添加新用户。但问题是当从“Database”继承“Auth”和“Admin”时,会创建两个“Database”实例。因此,如果“Admin”添加了一个新用户,“Auth”将不知道它。 Что можно сделать, чтобы не создавать две копии “数据库”?
class User;
class Database
{
private:
map<int, User> users;
protected:
Database() {}
void readFileOfUsers();
auto& getUsers() { return users; }
};
class Auth : public Database
{
private:
int userID;
public:
Admin itsAdmin;
User* itsUser;
Auth() : userID(0) { readFileOfUsers(); }
void logIn(std::string login, std::string password);
};
class Admin : public Database
{
public:
void getDatabase() { readFileOfUsers(); }// ?
void addNewUser(std::string login, std::string password);
};
class User
{
private:
std::string login;
std::string password;
public:
void userActions();
};
【问题讨论】:
-
那么继承在这里不是正确的工具。问问自己:是 Admin/Auth 数据库吗?如果它们包含在数据库中不是更有意义吗?
-
Admin真的应该继承自Database吗?记住"is-a" vs. "has-a"。Admin是Database吗?还是Database有Admin? -
你遇到了麻烦,因为你从彼此继承了不相关的类型。解决方案是不使用继承来完成此任务。
-
“Admin”必须有权访问“Database”类的方法。在这种情况下可以做什么?
-
@insania37 只需将数据库对象传递给管理方法。问问自己,如果您有两个数据库并且您希望同一个管理员在这两个数据库上工作,那么它将如何工作。简单的答案是将数据库对象传递给需要它的管理员方法,
标签: c++ inheritance