问题描述
如果我的某个班级包含另一个班级(通过合成),而该班级又包含另一个班级。例如:一个包含PersonalDetails类的Teacher类,其中包含一个Contactinformation类。
Contactinformation类:
class Contactinformation
{
private:
std::string m_email{};
std::string m_phoneNumber{};
public:
Contactinformation(const std::string &email,const std::string &phone)
: m_email{ email },m_phoneNumber{ phone }
{
}
// Solution 1
const std::string& getEmail() const { return m_email; }
const std::string& getPhoneNumber() const { return m_phoneNumber; }
// Solution 2
const Contactinformation& getContactInfo() const { return *this; }
// Solution 3
friend class Teacher;
};
PeronalDetails类:
class PersonalDetails
{
private:
Contactinformation m_contact;
std::string m_name;
public:
PersonalDetails(const Contactinformation &info,const std::string &name)
: m_contact{ info },m_name{ name }
{
}
// Solution 1
const std::string& getEmail() const { return m_contact.getEmail(); }
const std::string& getPhoneNumber() const { return m_contact.getPhoneNumber(); }
const std::string& getName() const { return m_name; }
// Solution 2
const Contactinformation& getContactInfo() const { return m_contact.getContactInfo(); }
const PersonalDetails& getPersonalDetails() const { return *this; }
// Solution 3
friend class Teacher;
};
老师课:
class Teacher
{
private:
PersonalDetails m_details;
double m_salary{};
public:
Teacher(const PersonalDetails &details,double salary)
: m_details{ details },m_salary{ salary }
{
}
// Solution 1
const std::string& getEmail() const { return m_details.getEmail(); }
const std::string& getPhoneNumber() const { return m_details.getPhoneNumber(); }
const std::string& getName() const { return m_details.getName(); }
double getSalary() const { return m_salary; }
void printEmail1() const
{
std::cout << getEmail() << '\n';
}
// Solution 2
const Contactinformation& getContactInfo() const { return m_details.getContactInfo(); }
const PersonalDetails& getPersonalDetails() const { return m_details.getPersonalDetails(); }
void printEmail2() const
{
std::cout << getContactInfo().getEmail() << '\n';
}
// Solution 3
const std::string& getTeacherEmail(const Contactinformation &c) const
{
return c.getEmail();
}
void printEmail3() const
{
std::cout << getTeacherEmail(getContactinformation());
}
};
教师类在Contactinformation(最“嵌套”的类)中访问成员(m_email和m_phoneNumber)的“正确方法”是什么? 我想不出的两种解决方案似乎都很棒。
解决方案1;在所有类中都有用于成员变量的getter方法。但这似乎是一个坏主意,因为Teacher类最终会使用很多getter方法。特别是如果将来我要添加更多的类。
解决方案2;是要返回实例本身。我不知道这是否更好,或者是否违反了任何最佳做法。但是您可以使用Teacher类中的实例在其上调用getEmail()。
解决方案3;正在使用朋友课程(没有太多使用经验)。但是由于您仍然必须传递一个Contactinformation实例才能获取m_email。与解决方案2似乎没有什么不同。
是否可以通过任何方法使Teacher类与Contactinformation类成为朋友(或其他事物),所以我可以执行以下操作:
teacher.getEmail();
除了Contactinformation中的吸气剂外,没有其他吸气剂吗?
解决方法
与朋友班有关的问题是,(将来)您将失去return articles(new ArticlesArgumentsDefinition() {
@Override
public void define(ArticlesArguments args) { }
});
用于与ContactInformation
不同的班级的机会,而不会真正从中受益。
如果Teacher
是PeronalDetails
的成员,并且Teacher
是ContactInformation
的成员。您可以简单地PeronalDetails
,它很长,并且要求所有这些成员都是teacher.personalDetails.contactInformation.m_email
。
midlle点可以是个性化的吸气剂:
public