クラスのサブクラス化では、サブクラスに追加の機能が追加されているので、親クラスのデリゲートもサブクラス化したいと考えています。これを行う最善の方法は何ですか?私はちょうど同じ名前のサブクラスで別のデリゲートプロパティを宣言した場合、私は警告を受けるだろう「プロパティのタイプ 『idが』 『idは』 『ParentClass』Objective-Cのデリゲートプロパティを正しくサブクラス化する方法はありますか?
7
A
答えて
1
NSTableView
とNSOutlineView
の例に従っから継承されたタイプと互換性がありません。
NSOutlineView
はNSTableViewのサブクラスであり、そのdataSource
とdelegate
のために、独自のプロトコルを定義
NSTableView
そのデリゲートをこのように宣言します。
- (void)setDelegate:(id <NSTableViewDelegate>)delegate;
- (id <NSTableViewDelegate>)delegate;
とNSOutlineView
:
- (void)setDelegate:(id <NSOutlineViewDelegate>)anObject;
- (id <NSOutlineViewDelegate>)delegate;
どうやらコンパイラは、プロパティ宣言であるよりも、裸のメソッド宣言で、より寛大です。
NSTable/OutlineViewとは異なり、サブクラスのプロトコルをベースクラスのプロトコルから継承させたい場合があります。
@protocol SpecializedProtocol <BaseProtocol>
...場合によっては状況によって異なります。ある警告を削除
// Class A
@protocol ClassADelegete;
@interface ClassA : NSObject
@property (nonatomic, weak) id<ClassADelegete> delegate;
@end
@protocol ClassADelegete <NSObject>
- (void)classADidSomethingInteresting:(ClassA *)classA;
@end
// Class B
@protocol ClassBDelegete;
@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassBDelegete> delegate; // Warning here
@end
@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end
2種類の溶液:
15
は警告を生成します。この例を考えます。
1)サブクラスでは、クラス定義の前にプロトコル定義を配置します。サブクラスでは)
// Class B
@class ClassB;
@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end
@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassBDelegete> delegate;
@end
2、新しいものと一緒にオリジナルのプロトコルを追加します:これはUITableView.h
でUITableViewDelegate
が何をするかである
// Class B
@protocol ClassBDelegete;
@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassADelegete, ClassBDelegete> delegate;
@end
@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end
私はAppleがこのようにそれがそうであるように(1)働くと仮定し、オプション(2)は警告を削除しますが、私はコンパイルしてこのような設定を何も実行していません。
関連する問題
- 1. ObjectiveCでクラスを正しくサブクラス化する方法は?
- 2. 私のクラスのサブクラス化を禁止する方法はありますか?
- 3. JavaScript(ES6)でSelectionオブジェクトをサブクラス化する方法はありますか?
- 4. DISTINCTの結果をグループ化し、COUNT行を正しくグループ化する方法はありますか?
- 5. ObjectiveCブロックを関数ポインタにラップする方法はありますか?
- 6. CSSを正しくサブクラス化していますか?
- 7. サブクラスでメソッドを空にする方法はありますか?
- 8. サブクラスで結合をフィルタリングする方法はありますか?
- 9. サブクラスの振る舞いをカスタマイズする方法、またはサブクラス化を特別な方法で行う方法はありますか?
- 10. カスタムネームスペースにあるメソッドをサブクラス化してオーバーライドする方法はありますか?
- 11. インスタンス化されたビューコントローラでコントロールを正しく初期化する方法はありますか?
- 12. ResultReceiverサブクラスを正しくサービスに送信する方法は?
- 13. 多くのサブクラスでUITableViewDelegateを使用してUIViewControllerをサブクラス化する方法
- 14. UIToolbarをサブクラス化する正しい方法
- 15. charポインタの配列を正しくコピーする方法はありますか?
- 16. アンドロイドアプリのディメンションを正しく設定する方法はありますか?
- 17. UIViewサブクラスの境界がコンソールで正しくありません
- 18. クラスを動的にサブクラス化し、Objective Cでサブクラスをインスタンス化する方法は?
- 19. UILabelをサブクラス化する方法は?
- 20. Javaビルダークラスをサブクラス化する方法は?
- 21. UIApplicationをサブクラス化する方法は?
- 22. PreferenceActivityをサブクラス化するアクティビティのレイアウトを簡単にカスタマイズする方法はありますか?
- 23. ニューラルネットワーク(MATLAB)の出力を非正規化する方法はありますか?
- 24. np.gradientの各ベクトルをエレガントに正規化する方法はありますか?
- 25. delphi VCLコンポーネントを使用してWinApi Editコントロールをサブクラス化する方法はありますか?
- 26. Rでは、パッケージ内のインポートされたクラスのオブジェクトをサブクラス化する方法はありますか?
- 27. JavaScriptで正しくJavaScriptをエスケープする方法はありますか?
- 28. テーブルをwinformsコントロールで正しくバインドする方法はありますか?
- 29. Vector3 TransformとTransformCoordinateを正しく計算する方法はありますか?
- 30. React onClickイベントをReduxに正しくバインドする方法はありますか?
私は後者のルート(メインクラスをサブクラス化した後にデリゲートプロトコルをサブクラス化する)を行ったが、コンパイラエラーをトリガーせずに別のデリゲートプロパティを宣言できませんでした。コンパイラを幸せにするための唯一の方法を述べたメソッド宣言はありますか? – Boon
私は他のやり方を知らない。 –