学生类和老师类,计算某门课的学分方法是不一样的:1.(学生按4*hour学分计算float型;老师按3*hour学分计算int型)利用traits技术实现
时间: 2024-12-21 13:21:26 浏览: 12
在面向对象编程中,你可以使用 traits(特质、特性或模板方法)的技术来解决这种需求差异。Traits 是一种软件设计模式,它允许你在运行时动态地给对象添加或移除某些行为,而不改变其基本结构。
首先,创建一个名为`CreditCalculator`的trait,定义一个计算学分的方法`calculateCredits`,但不指定具体的学分计算规则:
```cpp
trait CreditCalculator {
public:
virtual float calculateStudentCredits(float hour) const = 0;
virtual int calculateTeacherCredits(int hour) const = 0;
};
```
接着,为学生和老师类分别实现这个trait:
```cpp
class Student : public CreditCalculator {
private:
static constexpr float studentFactor = 4.0f;
public:
float calculateStudentCredits(float hour) const override { return hour * studentFactor; }
};
class Teacher : public CreditCalculator {
private:
static constexpr int teacherFactor = 3.0;
public:
int calculateTeacherCredits(int hour) const override { return hour * teacherFactor; }
};
```
在这里,`Student`类按4小时计费,`Teacher`类按3小时计费。当你需要对某个对象(可能是学生或老师)计算学分时,只需要检查它的类型并调用相应的方法:
```cpp
CreditCalculator* person;
// 创建学生和老师实例
Student student(6);
Teacher teacher(8);
person = &student;
std::cout << "Student credits: " << person->calculateStudentCredits(6) << std::endl; // 输出:24
person = &teacher;
std::cout << "Teacher credits: " << person->calculateTeacherCredits(8) << std::endl; // 输出:24
```
阅读全文