1

オブジェクティブ C に基づいて OOP の基礎を強化しようとしています。説明が長すぎて申し訳ありません。私のアプリには、クラス A、クラス B、およびクラス C の目的の C クラスとして 3 つのクラスがあります。クラスBの実装にクラスAのプロパティがあります。つまり、クラスBのプライベートプロパティになります。

// implementation Class B
@interface ClassB ()
  @property (nonatomic, strong) ClassA *classA;
@end

クラス C メソッドの 1 つでクラス B のインスタンスを作成し、クラス C のクラス B のインスタンスを介してクラス A のプロパティにアクセスしようとします。

// implementation Class C
@interface ClassC ()
  @property (nonatomic, strong) ClassB *classB;
@end

@implementation ClassC
- (void)someMethod
{
  NSString *string = [[NSString alloc] init];
  classB = [[ClassB alloc] init];
  string = classB.classA.displayString; //get an error here - ClassB doesn't have classA.
}
@end

エラーを回避するために、classA プロパティを実装から ClassB のヘッダーに移動しました。

// header Class B
@interface ClassB : NSObject
  @property (nonatomic, strong) ClassA *classA;
@end

しかし、誰もがクラス B のインスタンスを作成し、classA プロパティにアクセスして、クラス A の一部であるプロパティを使用/変更できるのではないかと心配しています。

質問: classA プロパティをクラス B のヘッダー ファイルに移動して、クラス C で使用できるようにするのは良いスタイルですか?それとも、クラス A から必要なものを返すメソッドをクラス B で作成する必要がありますか? 何かのようなもの:

@implementation ClassB
- (NSString*)displayStringOfClassA
{
  classA = [[ClassA alloc] init];
  return self.classA.displayString;
}
@end
4

4 に答える 4

1

で読み取り専用の文字列プロパティを提案しますClassB.h

ClassB.h:

@property (nonatomic, readonly) NSString *classAString;

ClassB.m:

- (NSString *) classAString
{
   return self.classA.displayString;
}

これは、必要な特定の文字列の「getter」メソッドとして機能し、他の人が classA にアクセスするのを防ぎます。

編集:

他の人は、ClassB.h に読み取り専用プロパティとして classA を追加することを提案しました。これにより、classA プロパティの変更が引き続き許可されます。classA が別の ClassA インスタンスに再割り当てされないことが保証されるだけです。

于 2013-09-30T20:51:26.793 に答える
1

「プライベート」@property()宣言ではなく、「フレームワーク」が必要なようです。

これを行うには、次のようなファイルを作成します。

ClassA_Private.h

それにはあなたの@property()宣言が含まれています。

次に#import "ClassA_Private.h"ClassA.m(の前の@implementation)およびそれを使用するサブクラスの両方で@property

これは、クラス拡張機能を作成する際の二次的な設計上の考慮事項でした。@property外部に公開されることなく、サブクラス間および/またはフレームワーク内で完全にアクセス可能な宣言を持つ機能を追加します。iOS を対象としたアプリケーションのフレームワークを作成することはできませんが、同じ機能が引き続き適用されます。

于 2013-09-30T21:56:52.513 に答える