次の継承レベルでこれにアクセスしないように、プロトコルをプライベートに継承できますか?
3 に答える
Objective-Cには、C ++のような「プライベート継承」(または「プライベート適合」)はありません。
ヘッダーファイルで適合性を宣伝することなく、プロトコルに適合させることができます。たとえば、ファイルのステートメントのNSCoding
上にこれを置くと、「密かに」準拠できます。@implementation
.m
@interface MyObject () <NSCoding>
@end
これは、プロトコルをクラスに追加するクラス拡張を宣言します。NSCoding
MyObject
ただし、誰でも(サブクラスを含む)、プロトコルを採用するかどうかを尋ねることができます。
[[MyObject class] conformsToProtocol:@protocol(NSCoding)]
// returns YES
[[MySubObject class] conformsToProtocol:@protocol(NSCoding)]
// also returns YES, if MySubObject is a subclass of MyObject
そして、誰でも最初にオブジェクトをキャストすることでにNSCoding
メッセージを送信できます。MyObject
[(id<NSCoding>)someObject encodeWithCoder:someCoder]
また、のサブクラスを作成し、MyObject
そのサブクラスもに準拠していることを宣言している場合NSCoding
は、ほぼ確実に[super encodeWithCoder:]
独自のencodeWithCoder:
メソッドから呼び出す必要があります。
いいえ、言語設計のため不可能です。
さらに、どのメソッドもオーバーライドできるため、呼び出されたメソッドが正しいクラスからのものであるかどうかを確認することはできません。
必要なメソッドを直接呼び出すことを許可するハックがあるかもしれませんが、それはそれほど簡単ではなく、不可能でさえあるかもしれません。
プロトコルであろうとなかろうと、メソッドがサブクラスによってオーバーライドされるのを止める方法はありません