【发布时间】:2021-01-26 12:50:41
【问题描述】:
好吧,我有下一个代码:
#include <type_traits>
#include <iostream>
#include <string>
#include <list>
#include <functional>
class base_main
{
public:
virtual ~base_main()
{
}
// some methods
};
class base_1 : virtual public base_main
{
// some methods
};
class base_2 : virtual public base_main
{
// some methods
};
class base_3 : virtual public base_main
{
// some methods
};
class object : public base_1, public base_2, public base_3
{
// some methods
};
// in other *hpp file
class object_controller_listener
{
public:
virtual void object_created( base_main* o )
{
// well, i want to work only with base_1 and base_2 interfaces, but not with base_3, and also i don't want to know something about object class in this *hpp
// is it good code design?
auto* xxx = dynamic_cast<base_1*>( o );
}
};
class objects_controller
{
void create()
{
std::unique_ptr<object> obj;
// ...
for( auto listener : m_listeners )
listener->object_created( obj.get() );
}
std::list<object_controller_listener*> m_listeners;
};
int main()
{
}
问题是 - 我怎样才能只使用 base_1 和 base_2 接口?我应该为它们创建两个单独的侦听器,并在 create() 函数中发送两个事件,还是应该使用 dynamic_cast 进行向下转换并在 create() 函数中只发送一个事件?这是好的代码设计还是感觉像代码味道?
更新:
例如:base_1 - 是render_base 类,它包含渲染数据,并具有设置和获取该数据的功能 base_2 - 碰撞器基类,它包含对撞机数据,并具有设置和获取该数据的功能 base_3 是物理基类和 object 是所有这些类的继承。当我只想使用渲染类时,我使用创建事件,该事件仅将 render_base 类发送到 render_system,它仅适用于渲染对象并真正使用多态性。但是,如果我想在其他地方使用对撞机和物理对象,而不了解渲染 - 我如何在基类中使用多态性?
【问题讨论】:
-
视情况而定....
-
为什么要限制
base_main的哪些子类要使用?您选择它作为一个可以扩展的接口,然后将其限制为您接受的类的子集。 -
if (xxx != nullptr) {xxx->some_method_of_base1();}。使用dynamic_cast检查对象是否提供接口意味着您需要在尝试使用特定于每个派生类的成员函数之前对每个派生类型进行硬编码检查。不这样做会产生未定义的行为。尽管在某些情况下dynamic_cast是必要的,但通常最好专注于使用多态性(在您的情况下,给base_main一组虚拟成员函数,这些函数可以由派生类根据需要使用和覆盖)代替诉诸dynamic_cast。 -
@Kaldrr 例如: base_1 - 是 render_base 类,包含渲染数据,并具有设置和获取此数据的功能 base_2 - 包含对撞机数据的对撞机基类,并具有设置和获取功能此数据库_3 是物理基类,对象是所有这些类的继承。当我只想使用渲染类时,我使用创建事件,该事件仅将渲染基类发送到渲染系统,它仅适用于渲染对象并真正使用多态性。
-
但是如果我想在其他地方使用对撞机和物理对象,而不了解渲染 - 我如何在基类中使用多态性? @彼得
标签: c++ oop design-patterns