8

Money と Dollar の 2 つのクラスがあるとします。Dollar は Money から継承されます。

Money には、クラス拡張で宣言されたプロパティがあります。

#import "Money.h"

@interface Money ()
@property(nonatomic) NSUInteger amount;
@end

@implementation Money

@end

Dollar はこのプロパティを継承しますが、Dollar のメソッドからは見えません。Dollar.m でプロパティを再宣言することで、「修正」できます。

@interface Dollar ()
@property(nonatomic) NSUInteger amount;
@end
@implementation Dollar


}
@end

私はこれが本当に嫌いで、コンパイラが何をしているのかを知っているかどうかさえわかりません:

  1. プロパティを表示するだけですか?
  2. 新しいプロパティと新しい iVar を作成し、前のものを「シャドウイング」していますか?

クラスとそのサブクラスの実装を除いて、すべての人からプロパティを非表示にする最良の方法は何ですか?

理想的には、実装の詳細であるため、.h ファイルに amount を表示したくありません。

4

1 に答える 1

10

最初の質問への回答として、おそらく最初のオプションです。Moneyコンパイル時にすべてをスムーズにするだけです。コンパイラとプリコンパイラは賢いです。

プライベートヘッダーを使用して、やろうとしていることを達成できます

公開ヘッダーファイルMoney.h

//Money.h 
@interface Money : NSObject
//public decl 
@end

サブクラスMoney-Private.hプライベートヘッダー ファイル

//Money-Private.h
@interface Money ()
@property(nonatomic) NSUInteger amount;
@end

Moneyおよびサブクラスまたはカテゴリの実装によって使用されるもの

ドルの公のDollar.h

#import "Money.h"
@interface Dollar:Money
@end

および実装Dollar.m

#import "Money-Private.h"
@implementation Dollar

-(void)foo
{
    self.amount = 75;
}

@end

公開フレームワークを作成することを選択した場合は、公開ヘッダーのみがバンドルにコピーされるようにしてください。

于 2013-06-19T13:45:59.033 に答える