- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一篇标题非常相似的帖子here ,但据我了解,实际问题有所不同。
我想知道是否可以强制我编写的类的用户覆盖某个方法,但同时应该不可能调用此方法(但它只能从我的类中调用) .
例如,如果我想执行以下操作:
class AbstrDataSource {
private:
int index;
protected:
int currentData;
public:
int getData(){return currentData;}
void loadData(int i){
// check valid index here
if (index != i){doLoad(i);}
this->index = i;
}
virtual void doLoad(int i)=0;
};
在 loadData() 中,我可以检查索引是否在有效范围内并进行一些簿记,而实际加载必须由用户通过覆盖 doLoad() 来提供。因为纯虚方法是接口(interface)的一部分,所以它们是公共(public)的,但是我如何强制 doLoad() 的实现只对我自己的类可见?
我的想法是将对象隐藏在一些包装器中:
class DataSupplier {
public:
DataSupplier(AbstrDataSource* s) : source(s){}
void loadData(int i){source->loadData(i);}
int getData(){return source->getData();}
private:
AbstrDataSource* source;
};
我没有使用抽象类,而是使用了包装器:
int SomeCalculation(DataSupplier* a,DataSupplier* b){
return a->getData() + b->getData();
}
然而,这并没有真正的帮助。假设第二个人提供了我的抽象类的实现:
class ImplDataSource : public AbstrDataSource{
public:
void doLoad(int i){this->currentData = i;}
};
然后第三个人仍然可以访问 doLoad():
void main(){
AbstrDataSource* ads = new ImplDataSource();
DataSupplier* ds1 = new DataSupplier(ads);
DataSupplier* ds2 = new DataSupplier(ads);
ads->doLoad(10); // <- How to avoid this ??
ds1->loadData(12);
ds2->loadData(12);
SomeCalculations(ds1,ds2);
}
也许有一种方法可以通过使用访问说明符...?
编辑:我已经得到了一些有用的答案,但我认为我没有足够清楚地陈述我的问题。只要 ImplDataSource 将 doLoad() 声明为 protected 或私有(private)的,一切都很好。然而,只看 AbstrDataSource,没有暗示 doLoad() 的任何实现都应该是私有(private)的(即使抽象 doLoad 是 protected 或私有(private)的,实际实现可以有任何访问权限)。我想知道是否有可能以某种方式“强制”抽象 doLoad() 的任何实现都是私有(private)的。也许我只是想得太复杂了,最简单的方法是在抽象方法的文档中添加注释(“作为私有(private)实现,否则它可能会失败”)。
最佳答案
您要实现的目标称为模板方法模式,并且我认为你在这里能做的最好的事情是将不太“敏感”的行为委托(delegate)给 doLoad 方法,并将 loadData(以及你想从派生类中隐藏的部分)置于私有(private)访问中
关于c++ - 如何将 "hide"虚方法? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26733422/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!