- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在用 C++ 设计一个项目,到了我怀疑的地步,而我应该使用继承来获得多态性。
具体来说,我有一个 JazzQuartet
类,它有 4 个对象:Saxophonist
、Pianist
、Bassist
和 Drummer
,每个都有一个play()
和listen()
方法,有不同的实现。
我想让它们都继承自 Musician
类,这样我就可以拥有一个 Musician
对象数组,并调用每个对象的 play( )
和 listen()
方法,因此我可以让任何 Musician
listen()
成为任何其他人。但由于它们的实现彼此完全不同,我将使用这种继承来获得多态性,我不确定这是否是一个好的设计选择。
关于这个问题有什么建议吗?
提前谢谢大家!
最佳答案
"... so I can have an array of Musician objects and call each one´s play() and listen() methods, and also so I can make any Musician listen() to any other."
Musician
应该是一个抽象类,即一个接口(interface):
class Musician {
public:
virtual void play() = 0;
virtual void listen(Musician& other) = 0;
virtual bool isPlaying() = 0;
virtual ~Musician() {}
};
是的,它被认为是提升界面的好设计。
通过这种方式,您强制派生类必须实现这些功能,并允许客户端访问 Musician
实例,而不需要知 Prop 体的派生类型。
正如您一直要求将整个整体存储到一个数组中:
通过上述设计,您可以使用 std::unique_ptr<Musician>
的数组聚集特定的音乐家合奏。
std::vector<std::unique_ptr<Musician>> jazzQuartet(4);
std::unique_ptr<Saxophonist> sax = new Saxophonist();
std::unique_ptr<Pianist> piano = new Pianist();
std::unique_ptr<Bassist> bass = new Bassist();
std::unique_ptr<Drummer> drums = new Drummer();
jazzQuartet[0] = sax;
jazzQuartet[1] = piano;
jazzQuartet[2] = bass;
jazzQuartet[3] = drums;
// And wire them up as necessary
//------------------------------------
// Usually everyone in the combo needs to listen to the drums
sax->listen(*drums);
piano->listen(*drums);
bass->listen(*drums);
...
// Let them all play
for(auto& m : jazzQuartet) { // Note the & to avoid copies made for the items
m->play();
}
关于c++ - 仅将继承用于 C++ 中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31273491/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!