考虑以下基类:
@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 *”不兼容
虽然我可以通过使用 type 声明 layer 属性来消除第一个警告id
(这不是最好的解决方案,因为我不能在没有类型转换的情况下使用点语法,而且我可能会犯编译器无法捕捉的错误):
@property (readonly) id myLayer;
我不能对 C++ 类型做同样的事情。grid
将属性声明为void *
也无济于事。
那么有没有合适的方法来处理这种情况呢?或者我应该简单地使用编译指示使警告静音,因为我知道我在做什么?
请不要建议不要使用 C++ 类,因为它不是一个选项(我正在创建一组跨平台模型类以简化将来的移植)。