他の多くのViewControllerがサブクラス化するベースViewControllerがあります。サブクラスでオーバーライドする必要がある特定のメソッドを適用する方法はありますか?
安全のために何よりも。
乾杯
他の多くのViewControllerがサブクラス化するベースViewControllerがあります。サブクラスでオーバーライドする必要がある特定のメソッドを適用する方法はありますか?
安全のために何よりも。
乾杯
Xcodeでは(clangなどを使用__attribute__((unavailable(...)))
して)抽象クラスにタグを付けるために使用するのが好きなので、使用しようとするとエラー/警告が表示されます。
このメソッドを誤って使用することに対するある程度の保護を提供します。
基本クラス@interface
タグの「abstract」メソッド:
- (void)myAbstractMethod:(id)param1 __attribute__((unavailable("You should always override this")));
これをさらに一歩進めて、マクロを作成します。
#define UnavailableMacro(msg) __attribute__((unavailable(msg)))
これにより、次のことが可能になります。
- (void)myAbstractMethod:(id)param1 UnavailableMacro("You should always override this");
私が言ったように、これは実際のコンパイラ保護ではありませんが、抽象メソッドをサポートしない言語で取得するのとほぼ同じです。
他の言語では、これは抽象クラスとメソッドを使用して行われます。Objective-Cにはそのようなことはありません。
あなたが得ることができる最も近いものは、スーパークラスで例外を発生させることです。そのため、サブクラスはそれらをオーバーライドするように「強制」されます。
[NSException raise:NSInternalInconsistencyException format:@"Subclasses must override %@", NSStringFromSelector(_cmd)];
rjstellingに触発されて、私はこれをさらに満足のいく方法で解決しました。
プレフィックスで、次を定義します。
#define abstract __attribute__((unavailable("abstract method")))
次に、次のように抽象メソッドを追加できます。
- (void) getDataIdentifier abstract;
このメソッドを呼び出そうとすると、コンパイラのセマンティックの問題/エラー(Xcode 5.1)が発生します。
'getDataIdentifier' is unavailable: abstract method
更新: メソッドを呼び出すことは機能していないようです(少なくともクラス階層内からではありません)。これを修正できたら、アップデートで戻ってきます。
次のようにLLVM機能を使用して、コンパイル時にサブクラスにプロパティを実装するように要求できます(メソッドは以下を参照してください)。
NS_PROTOCOL_REQUIRES_EXPLICIT_IMPLEMENTATION
@protocol Protocol
@property (readonly) id theWorstOfTimes; // expected-note {{property declared here}}
@end
// In this example, ClassA adopts the protocol.
@interface ClassA : NSObject <Protocol>
@property (readonly) id theWorstOfTimes;
@end
@implementation ClassA
- (id)theWorstOfTimes{
return nil; // default implementation does nothing
}
@end
// This class subclasses ClassA (which also adopts 'Protocol').
@interface ClassB : ClassA <Protocol>
@end
@implementation ClassB // expected-warning {{property 'theWorstOfTimes' requires method 'theWorstOfTimes' to be defined - use @synthesize, @dynamic or provide a method implementation in this class implementation}}
@end
ClassBがプロトコルを再実装するとわかるようにexpected-warning
、プロパティメソッドが欠落していることがわかります。NS_PROTOCOL_REQUIRES_EXPLICIT_IMPLEMENTATION
はの単なるマクロで__attribute__((objc_protocol_requires_explicit_implementation))
あり、このコードサンプルはここでその機能のテストハーネスから変更されています。
これは以前はメソッドでも機能していましたが、2014年にその目的の誤解によってバグが発生し、現在はプロパティでのみ機能するようになりました。作成者にメールで通知し、元の状態に戻ったことを願っています。バグをテストするには、プロトコルにメソッドを追加すると、ClassBに警告が表示されないことがわかります。うまくいけば、いくつかのメソッドを変更して、プロパティを読み取り専用にして、少なくともそれをある程度利用できるようにすることができます。
以下にいくつかのドキュメントがありますNS_PROTOCOL_REQUIRES_EXPLICIT_IMPLEMENTATION
:
ImplementingAccessibilityforCustomControls
nsaccessibilitybutton