我正在努力实现适配器设计模式以利用现有的类。我的问题是,这些类的工作原理几乎相同,但它们的名称不同,而另一个的功能较少。
例如,每个Work类和Homework类都有一个执行相同功能的函数,即doWork()和doHomework()。
我可以链接到这些doThis()在任务界面。但是,工作类没有做到()函数,而作业类有它。我要如何处理?只是没有执行?有没有更好的方法?
class Task {
public:
virtual int doThis() = 0;
virtual bool done() = 0;
};
class Work {
public:
Work();
int doWork();
};
class Homework {
public:
Homework();
int doHomework();
bool done();
bool isDone;
};
class WorkAdapter : public Task, private Work {
public:
WorkAdapter();
int doThis() {
return doWork();
}
virtual bool done() {
// Is this okay not to implment this?
}
};
class HomeworkAdapter : public Task, private Homework {
public:
HomeworkAdapter();
int doThis() {
return doWork();
}
virtual bool done() {
return isDone;
}
};
int main() {
Task *homework = new HomeworkAdapter();
Task *work = new WorkAdapter();
homework->doThis();
bool isHomeworkDone = homework->done();
work->doThis();
bool isWorkDone = work->done(); // This would never be called in my implementation...
}
使用多重继承的适配器实现(对于目标是公共的,对于适应者是私有的)是一种有效的方法。
只需注意函数的返回类型即可:
class HomeworkAdapter : public Task, private Homework {
public:
HomeworkAdapter() {}
int doThis() override { // make sure you override target member
return doWork(); // and return value as expected
}
bool done() override {
return isDone;
}
};
提示:不需要在派生类中指定virtual。相反,值得使用重写,只是为了避免在参数或返回类型不匹配的情况下出现细微问题。
当没有功能可用于done()
在适配器中处理时,您必须模拟它。因此,不仅要更改名称,还要确保类似的行为:
class WorkAdapter : public Task, private Work {
bool isdone; // functionality to add
public:
WorkAdapter() : isdone(false) {}
int doThis() override {
auto rc = doWork();
isdone = true; // once it's done, it's done ;-)
return rc;
}
bool done() override {
return isdone; // you must add this
}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句