.hファイル内にプライベートivarsをリストアップするAppleクラスをサブクラス化するときは、サブクラス.mファイル内のクラス拡張子@interfaceの自分のサブクラスにあるそれらのivarsをサブクラス実装にアクセスできるように再宣言してもかまいません?プライベートivarsをサブクラスに再宣言してアクセス可能にしてもよろしいですか?
答えて
あなたは、サブクラスでインスタンス変数を宣言すると、パブリックインターフェイスまたはクラスの拡張であること主張再宣言に関係なく、同じ名前で既存のスーパークラスのインスタンス変数を再宣言しないことを心に留めなければなりません。同じ名前を使用しても、は異なるインスタンス変数です。
これはあなた自身で試すことができます。
@interface Base : NSObject {
@private
int _number;
}
@end
@implementation Base
- (id)init { self = [super init]; if (self) _number = 10; return self; }
- (void)logNumber { printf("base = %d\n", _number); }
@end
@interface Derived : Base
@end
@interface Derived() {
int _number;
}
@end
@implementation Derived
- (id)init { self = [super init]; if (self) _number = 20; return self; }
- (void)logNumberDerived { printf("derived = %d\n", _number); }
@end
int main(void) {
Derived *o = [Derived new];
[o logNumber];
[o logNumberDerived];
return 0;
}
出力:例えば
base = 10
derived = 20
スーパーにおける_number
は、サブクラス(拡張子)で_number
異なるからです。うん
s _OBJC_IVAR_$_Base._number
s _OBJC_IVAR_$_Derived._number
私はここにまさに私自身に一致する答えを見つけた:彼らはそれは@privateた場合はhttp://lists.apple.com/archives/cocoa-dev/2007/Feb/msg00939.html
、あなたはそれが理由だと を想定しなければならない@protectedありません。その理由は、もちろん単純に、それはあなたが、非常に明確にない可能性は、それが直接 アクセスするにはOKこと、言わないと...
良い理由を 知るまで、すべてが@private作るために賢明だ ているかもしれませんそれが技術的に可能であっても。 はあなたが公開/保護されたインターフェイスに必要な 機能を公開するために、スーパークラスのメンテナを請願しながら行う
安全な事は、独自のクラスで再行うすべてです。
:あなたはnm -a
とバイナリ出力のシンボルを調べる場合は、コンパイラは二つの異なるシンボルを生成することがわかります。それはちょっと古くて正式ではなく健全な思考です。興味深いもの: –
uchuugaka
- 1. スーパークラスでivarsを宣言するか、サブクラスで@synthesizeを宣言しますか?
- 2. 取得可能なパスワードを保存してもよろしいですか?
- 3. Magento - Mage_Downloadableを無効にしてもよろしいですか?
- 4. ARIAの参考にしてもよろしいですか?
- 5. 警告:宣言は何も宣言していません
- 6. オブジェクトをパラメータとして宣言しても機能しません。
- 7. チャンネルを開いたままにしてもよろしいですか?
- 8. 「続行してもよろしいですか? SQLコマンド?
- 9. Apple App Storeで[トリガーリロード]を有効にしてもよろしいですか?
- 10. c#スーパークラスとしてサブクラスを宣言する
- 11. データベースにユーザー構成設定を保存してもよろしいですか?
- 12. SVProgressHUDをviewWillDisappearで閉じてもよろしいですか?
- 13. @classを使用してデリゲートプロトコルの宣言にアクセスする
- 14. MXMLでのディクショナリ宣言は可能でしょうか? MXMLで
- 15. なぜゲッターとセッターメソッドをプライベートと宣言しますか?
- 16. C++クラスの中で "using namespace"を宣言してもいいですか?
- 17. JavaScriptで各クリックを再宣言しないようにカウントを宣言する方法は?
- 18. サブクラスオブジェクトをスウィフトでスーパークラスとして宣言しますが、オブジェクトはまだサブクラスとして動作します
- 19. ロールオーバーのサブクラスを選択しても機能しませんか?
- 20. 宣言型サービスを参照していない宣言型サービス
- 21. メインスレッドからセグを実行してもよろしいですか?
- 22. これを何か他のものとして宣言する
- 23. どのようにしてVB_DATEでMAX_DOUBLEを宣言しますか?
- 24. パペット重複宣言:クラス[Mongodb]は既に宣言されています。再宣言できません
- 25. Macアプリのリリースでivarsを明示的に宣言しないようにするにはどうすればよいですか?
- 26. ハウツーカスタムイベントを宣言して聞くには?
- 27. Androidスタジオでダイアログを閉じて戻ってもよろしいですか?
- 28. クラスエクステンションで宣言された変数にどのようにアクセスしますか?
- 29. ドメインをGoogleに承認した後にGoogle TXT確認レコードを削除してもよろしいですか?
- 30. trelloデベロッパーAPIキーを共有してもよろしいですか?
しかし、おそらく、同じように宣言されている場合、あなたの例は、superで実装されたメソッドで参照されるものがsuperで宣言されたものであることを示しています。サブクラスで宣言されたメソッドで参照されるものは、サブクラスで宣言されたものになりますか? – uchuugaka
@uchuugaka正解。スーパークラスのivarはプライベートなので、サブクラスはそのivarにアクセスすることができず、それ自身の異なるivarしか見ることができません。スーパークラスivarにアクセスするには、(Objective-CランタイムAPIを使用して)余分な努力をする必要があります。 –
が確認されました。私はいくつかのバリエーション、セッター、getters&プロパティでこれをテストし、あなたの言うとおりにできることは確かです。そして、この動作は簡単に "見える"ことができます。ivarは、クラスがivarの親クラスであるオブジェクトです。私は再宣言していると "思っています" ...(そう、私はこの質問にどのように到着したのですか? unsubclassable Cタイプのivarはよりクリアです!) – uchuugaka