【发布时间】:2013-09-26 16:21:34
【问题描述】:
考虑以下基类:
@interface ViewBase : UIView
@property (readonly) LayerBase *myLayer;
+ (Class)myLayerClass; // _myLayer = [[[self class] myLayerClass] new];
@end
@interface LayerBase : CALayer
@property AbstractGrid *grid;
@end
class AbstractGrid
{
public:
int rows, columns;
virtual someMethod() = 0;
}
我有一个模板Grid 类,它使用不同的单元格类型(需要AbstractGrid,因为不可能创建模板Objective-C 类):
template <class Cell>
class Grid : public AbstractGrid
{
public:
Cell **cells;
virtual someMethod() {}
}
现在我想创建一个ViewBase 的子类,它的类型为myLayer 也是LayerBase 的子类(+myLayerClass 方法也被重新定义)并为模型类使用不同的模板参数,例如:
@interface AView : ViewBase
@property (readonly) ALayer *myLayer;
@end
@interface ALayer : LayerBase
@property Grid<GridCell> *grid;
@end
class GridCell
{
public:
int row, column;
}
应用程序使用这种方法可以正常工作,但编译器会警告我关于不兼容的属性类型:
属性类型“ALayer *”与继承自“ViewBase”的类型“LayerBase *”不兼容
属性类型“Grid *”与继承自“LayerBase”的类型“AbstractGrid *”不兼容
虽然我可以通过使用id 类型声明层属性来消除第一个警告(这不是最好的解决方案,因为我不能在没有类型转换的情况下使用点语法,而且我可能会犯错误哪个编译器不会能抓到):
@property (readonly) id myLayer;
我不能对 C++ 类型做同样的事情。将grid 属性声明为void * 也无济于事。
那么有没有合适的方法来处理这种情况?或者我应该简单地使用 pragma 使警告静音,因为我知道自己在做什么?
请不要建议不要使用 C++ 类,因为它不是一个选项(我正在创建一组跨平台模型类以方便将来移植)。
【问题讨论】:
-
也许见 stackoverflow.com/questions/1365732/… 与 obj-c 中的多继承类相比,复合类可能会让人头疼
-
我没有使用多重继承,有聚合
标签: c++ ios objective-c templates inheritance