Tom*_*des 4 c++ polymorphism inheritance
我正在用C++设计一个项目并且到了我怀疑的地步,而我应该使用继承来获得多态性.
具体地讲,我有一个类JazzQuartet,其具有4个对象:Saxophonist,Pianist,Bassist和Drummer,每一个play()和listen()方法,具有不同的实现.
我想让它们都继承自一个类,Musician所以我可以拥有一个Musician对象数组并调用每个play()人和listen()方法,所以我可以Musician listen()对任何其他人做任何事.但是由于它们的实现完全不同,我只是为了获得多态性而使用这种遗产,我不确定这是否是一个好的设计选择.
对此事有何建议?
谢谢大家!
"...所以我可以拥有一系列音乐家对象并调用每个人的play()和listen()方法,这样我就可以让任何音乐家听()给任何其他人."
Musician 应该是一个抽象类,即一个接口:
class Musician {
public:
virtual void play() = 0;
virtual void listen(Musician& other) = 0;
virtual bool isPlaying() = 0;
virtual ~Musician() {}
};
Run Code Online (Sandbox Code Playgroud)
是的,它被认为是促进界面的好设计.
通过这种方式,您可以强制派生类必须实现这些功能,并允许客户端访问Musician实例,而无需了解具体的派生类型.
正如您一直要求将整个集合存储到数组中:
通过上述设计,您可以使用一组数据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();
}
Run Code Online (Sandbox Code Playgroud)
这是多态性的完全合理用法. Saxophonist,Pianist,Bassist,并且Drummer都表现出一个"是"的有关系Musician.
您的Musician类将是纯虚拟的(也称为接口).