我有这种情况,我试图为空间搜索结构公开一个标准API,其中构建结构的各种方法的输入数据是相同的,但搜索结构的构建方式是不同的。 我有基类上数据的setter和派生类需要实现构建搜索结构的纯虚拟Build()方法。 下面是我的基类的样子
class SpatialSearch
{
public:
void SetData(Data data_)
{
this->data = data_;
this->dirty = true;
}
virtual void Build() = 0;
int search(Vec3 point)
{
if(dirty)
Build();
// Code to perform a search. I won't get into the
// nitty gritty of this, but this exists as a commom
// implementation on the base class for all the spatial
// search structures.
}
private :
Data data;
bool dirty;
}
因此,如果您注意到,每次搜索调用都会检查dirty
标志。
如果数据在上次之后发生了变化,我会重建结构。
但是,Build方法是在派生类上实现的,我需要一种方法来强制执行在Build方法执行后将此标志设置为false
的方法,而不仅仅是为编写该方法的人留下指南。派生类在其“构建”方法中具有dirty = false
。
简而言之,我需要一种方法来确保用户在每次执行dirty = false
方法后都设置了Build
。
答案 0 :(得分:4)
执行此操作的常用方法是使用垂直界面和水平界面(受保护和公共)。
“水平界面”是该类用户看到的那个,“垂直”界面是派生类实现者重写以添加功能的那个。
class SpatialSearch
{
public:
void SetData(Data data_)
{
this->data = data_;
this->dirty = true;
}
void Build() // no longer virtual
{
internal_build();
dirty = false;
}
int search(Vec3 point)
{
if(dirty)
internal_build();
// Code to perform a search. I won't get into the
// nitty gritty of this, but this exists as a commom
// implementation on the base class for all the spatial
// search structures.
}
protected:
virtual void internal_build() = 0; // implementers override this
private :
Data data;
bool dirty;
}
class SpecialSpatialSearch
: public SpatialSearch
{
protected:
void internal_build() override
{
// do the build without caring or knowing of the
// existence of the dirty flag
}
};