次のような状況があります: を拡張していUITextView control (MyTextView : UITextView)
ます。ランタイム デバイスのバージョンに応じて、さまざまな実装があります。MyTextView
そのため、現在、クラスの実装には多くの「if-else」ステートメントがあります。
より保守しやすくするために、別のクラスに分割したいと思います。
MyTextViewIos5 : MyTextView
、MyTextViewIos6:MyTextView
デバイスの iOS バージョンに応じて、どのサブクラスを作成するかを実行時に認識するファクトリ関数を作成します。
MyTextView をパラメーターとして使用している場合、このソリューションは完全に機能します。
MyTextView* textView = [Factory createWithFrame:frame];
問題は、MyTextView (externalTextView:MyTextView)
特定のメソッドを継承して拡張するクラスがあるときに始まります。そのinitWithFrame
メソッドは次のようになります。
- (id)initWithFrame:(CGRect)frame {
self = [Factory createWithFrame:frame];
if (self) {
...
}
return self;
}
スーパーinitwithFrame
を呼び出す代わりに、自分の工場を呼び出しています。
特定のメソッドを呼び出すと、 MyTextViewIos5またはMyTextViewIos6が呼び出された特定のメソッドを実装していないexternalTextView
というエラーでアプリがクラッシュします。
それを機能させるための回避策はありますか?