Вот как я могу сделать это в псевдокоде:
class Result {
public:
int getField(name);
string getField(name);
}
class Connection {
public:
void save(list<pair<string, string>> properties);
Result query();
}
class DBConnection {
private:
class DBResult : public Result {
}
public:
Result query() {
return ( DBResult );
}
void save
}
class Object {
public:
void load(Result);
void save(Connection) {
// make properties list
connection.save(properties);
}
}
Без рефлексии в стиле Java, вероятно, я бы так и сделал, не вступая в отношения "дружба". Тогда вы не будете тесно связывать знание логики соединений с классами соединений.
...
Вы также можете создать шаблонные функции, но вам все равно понадобятся отношения с друзьями.
class Object {
public:
friend template<class Conn, class Obj> load(Conn c, Obj o);
friend template<class Conn, class Obj> save(Conn c, Obj o);
}
load<Connection, Object>(Connection c, Object o) {
//access o.private to load into c
}
Я не уверен, куда бы я пошел. С одной стороны, вы инкапсулируете логику загрузки / сохранения в свои классы объектов, что отлично подходит для локальности, но может тесно связать вашу постоянство и бизнес-логику в одном месте.