Deq*_*ing 1 c++ polymorphism design-patterns
假设我有一个名为Person的班级,他拥有三种宠物:
class Person
{
public:
accept(Pet a);
private:
Dog d; // is a Pet
Cat c; // is a Pet
Fish f; // is a Pet
}
Person::accept(Pet a)
{
// if pet is Dog, then
d = a;
// if pet is Cat, then
c = a;
// if pet is Fish, then
f = a;
};
Run Code Online (Sandbox Code Playgroud)
我想typeid
可以在这里使用.但是,它对我来说仍然很奇怪.
是否有某种多态性,虚函数或某些OOP模式可以应用?
- 编辑 -
对不起这里的坏例子.让我尝试另一个:
// Usually a context contains three different resources:
class Context
{
public:
setResource(Resource *r);
private:
Buffer *b_; // is a Resource
Kernel *k_; // is a Resource
Sampler *s_; // is a Resource
};
Context::setResource(Resource *r) { // same logic as Person::accept() above }
Context::handlingBuffer() { if (b_) b_->init(); ... }
Context::run() {
if (b_ && k_) {
k_.setBuffer(b_);
k_.run();
}
}
...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,看上去就像添加Resource *r_[3]
在Context
会让事情变得更加复杂.
那么,是否可以将Resource的基类指针传递给setResource()
它,它可以自动决定要设置哪个资源?
由于你Pets
按值保持,你可以忘记多态并只是重载accept
成员函数:
class Person
{
public:
accept(const Dog& a) { d_ = a; }
accept(const Cat& a) { c_ = a; }
accept(const Fish& a) { f_ = a; }
private:
Dog d_; // is a Pet
Cat c_; // is a Pet
Fish f_; // is a Pet
};
Run Code Online (Sandbox Code Playgroud)