我想知道哪个是解决此问题的更好方法:
教师可以教授多个科目,也可以考虑实验室以外的所有科目,也可以兼任研究所。 Lab
,Subject
,Teacher
也有一些其他变量。我没有在这里写这些。
可以单独添加新lab,subject and teacher
。添加教师后,我只输入Teacher class
和labCode
以及subCode
的所有变量。有一些预定义的实验室和主题以及稍后添加的其他实验室和主题。如果可以的话,我可以查看显示他的实验室和主题详细信息的教师记录。
我在c ++中的概念不是太强,我不知道哪一个更好。我应该将Teacher类中的指针指向Lab和Subject类,还是应该将其固有,或者是否有更好的方法来执行此操作。
class Lab{
char labCode[20];
char labName[40];
int labYear;
//here default constructor
};
class Subject{
char subCode[20];
char subName[20];
int subYear;
//here default constructor
};
//-------------------------------------
class Teacher{
char facName[30];
int teacherSubCount;
int teacherLabCount;
Subject *subject;
Lab *lab;
//here default constructor
};
//------------or should i do like this--------------
class Teacher:public Lab,public Subject{
char teacherName[30];
int teacherSubCount;
int teacherLabCount;
//here default constructor
};
如果您可以推荐任何教程,那么我可以学习指针的强大功能,因为我的书中指出“指针是非常强大的c ++”,但它们只给出了一些简单的例子:)
答案 0 :(得分:4)
“赞成'对象组合'超过'类继承'。” - Gang of Four
更具体地说,你的课程首先要问自己......“教师是一种实验室还是一种主体?”显然,答案是“不”。
在继承模型中,子类本身应该是父类的实例。考虑Liskov Substitution Principle,该子对象应该可以作为该父对象处理。因此,如果有代码正在寻找Subject
,您可以将Teacher
传递给它。直觉上,这没有多大意义,也不能准确表示正在建模的现实领域实体。
在这种情况下,您肯定需要对象组合而不是类继承。 Teacher
有一个 Lab
而有一个 Subject
,而是一个 Lab
}或是 Subject
。实际上,如果Teacher
可以拥有多个Lab
或Subject
s,那么组合只会从单个实例类成员更改为数组或列表某种。在这种情况下,继承方法会完全破坏。
在对代表这样的现实世界概念的对象进行建模时,请考虑最重要的现实世界概念的直觉以及实现次要的技术捷径。如果在建模的方面没有意义,那么它在代码中也没有意义。
答案 1 :(得分:3)
考虑一下'is-a'(用于继承)和'has-a'(用于聚合)关系是否在您提出的解决方案中有意义
Teacher
既不是Lab
也不是Subject
- 我认为您应该使用汇总解决方案。
但是,在开始使用代码之前,您真正需要完全排序的是数据模型。您需要确定对象之间的关系和多重性(即一对一,一对多等)。
答案 2 :(得分:3)
继承意味着“is-a”关系,而指针意味着“has-a”关系。
老师是实验室吗?老师是一个学科吗?不,它有一个主题,它有一个实验室,所以它是一个“有一个”的关系。所以你应该使用指针,在这种情况下。
当你试图改变教师的实验室时,为什么继承不起作用会变得明显。您可以轻松更改指针指向的对象,但替换基类的所有数据会更加麻烦。
举一个例子,你将使用继承,EnglishTeacher可以继承教师,因为它也是一名教师,但具有额外的能力。
答案 3 :(得分:1)
采用常识方法:
继承表示is-a
关系。显然老师
既不是Subject
也不是Lab
,这将是一个严肃的目光
序幕。所以我要说聚合(has-a
或has-many
)就是这样的
去。
您还需要决定是否使用值语义 或引用语义。这意味着平等将是实际的平等 程序中的对象或通过某些对象可以计算 对象的一部分。
如果你使用引用语义,你需要确保你是 使用智能指针或其他形式的内存管理,否则 事情很快变得丑陋。
答案 4 :(得分:1)
当继承类时,如上一个示例所示,将其视为扩展该类的现有定义行为。那么,请问自己一个问题:“老师”是否增强了“实验室”的能力?对我来说,答案很清楚 - 他们没有 - 他们是完全不同的对象,因此继承不是在问题域中对这些元素进行建模的理想方式。老师有一个类,一个类一个主题,等等 - 因此,聚合似乎是一个更好的方法。
答案 5 :(得分:0)
如果你看一下这个例子,你会理解这个概念:
void doExperimentsIn( Lab &room ){...}
如果您从Teacher
派生Lab
,您也可以在Teacher
内进行实验。 (这很愚蠢。)