.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. スーパークラスで宣言されていないサブクラスのフィールドにアクセスできますか?
- 4. メタクラスを使用して前方宣言を可能にする
- 5. Magento - Mage_Downloadableを無効にしてもよろしいですか?
- 6. がアクセス可能に設定されていても、それを使用してもプライベートなアクセス権にアクセスできない
- 7. ARIAの参考にしてもよろしいですか?
- 8. 警告:宣言は何も宣言していません
- 9. behatでリポジトリをテストしてもよろしいですか?
- 10. ファイルライターを常に開いたままにしてもよろしいですか?
- 11. 別の構造体内で構造体を宣言し、プライベートとして宣言されたときに問題にアクセスする
- 12. DelegateCommandでCanExecuteを実行しても式の宣言が機能しない
- 13. CURLOPT_WRITEFUNCTIONを2回設定してもよろしいですか?
- 14. OpenGL 1.1を使用してもよろしいですか?
- 15. オブジェクトをパラメータとして宣言しても機能しません。
- 16. 同じ実行可能ファイルの複数のインスタンスを実行してもよろしいですか?
- 17. チャンネルを開いたままにしてもよろしいですか?
- 18. c#スーパークラスとしてサブクラスを宣言する
- 19. 「続行してもよろしいですか? SQLコマンド?
- 20. 別のJavaクラスでGUIオブジェクトを宣言してアクセス可能にする必要があります
- 21. Apple App Storeで[トリガーリロード]を有効にしてもよろしいですか?
- 22. どのようにしてhashmapを宣言できますか?
- 23. PHP。非抽象メソッドを抽象として再宣言することは可能ですか?
- 24. SVProgressHUDをviewWillDisappearで閉じてもよろしいですか?
- 25. データベースにユーザー構成設定を保存してもよろしいですか?
- 26. ビジュアルスタジオ200815をビジュアルスタジオ2015にインストールしてもよろしいですか?
- 27. Notification Hubで利用可能なすべてのインストールに新しいタグを追加してもよろしいですか?
- 28. 統合テストでデータベースにヒットしてもよろしいですか?
- 29. @classを使用してデリゲートプロトコルの宣言にアクセスする
- 30. 2つのアプリを角度で宣言しても機能しません
しかし、おそらく、同じように宣言されている場合、あなたの例は、superで実装されたメソッドで参照されるものがsuperで宣言されたものであることを示しています。サブクラスで宣言されたメソッドで参照されるものは、サブクラスで宣言されたものになりますか? – uchuugaka
@uchuugaka正解。スーパークラスのivarはプライベートなので、サブクラスはそのivarにアクセスすることができず、それ自身の異なるivarしか見ることができません。スーパークラスivarにアクセスするには、(Objective-CランタイムAPIを使用して)余分な努力をする必要があります。 –
が確認されました。私はいくつかのバリエーション、セッター、getters&プロパティでこれをテストし、あなたの言うとおりにできることは確かです。そして、この動作は簡単に "見える"ことができます。ivarは、クラスがivarの親クラスであるオブジェクトです。私は再宣言していると "思っています" ...(そう、私はこの質問にどのように到着したのですか? unsubclassable Cタイプのivarはよりクリアです!) – uchuugaka