次の基本クラスを検討してください。
@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
プロパティを as と宣言してvoid *
も役に立ちません。
そのような状況を処理する適切な方法はありますか?または、自分が何をしているのかを知っているので、プラグマを使用して警告を黙らせるべきですか?
C++ クラスはオプションではないため、使用しないようにアドバイスすることはご遠慮ください (将来の移植を容易にするために、クロスプラットフォーム モデル クラスのセットを作成しています)。