5

抽象クラスを作成し、そのプロパティの一部をサブクラスに継承しようとしています。抽象クラスのヘッダー ファイルにプロパティを残すと、すべてのプロパティにアクセスできます。問題は、サブクラスのインスタンスもこれらのプロパティにアクセスできることです。これは、私の場合は常に望ましいとは限りません。

たとえば、ボタンの押下をサブクラスに送信する抽象クラスにデリゲートがあります。これは継承を構造化する最良の方法ではない可能性があることを認識しているため、他の提案を歓迎します。ただし、インスタンスですべてのプロパティを使用可能にすることなく、サブクラスがスーパークラスからいくつかのプロパティを継承する方法を知りたいです。前もって感謝します!

以下にコード例を示します。

@interface AbstractClass : UIView

@property (nonatomic, strong) id<ButtonDelegate>buttonDelegate;

@end

…

@protocol ButtonDelegate

@required
- (void) buttonWasPressed;

@end

…

@interface SubClass() <ButtonDelegate>

- (id)init {
    self = [super init];
    if (self) {
        self.buttonDelegate = self;
    }
    return self;
}

-(void) buttonWasPressed {
    [self doSomething];
}

…

@implementation ViewController

- (void)viewDidLoad {
    SubClass *subClass = [[SubClass alloc] init];
    subClass.buttonDelegate = self; // THIS IS NOT DESIRABLE
}
4

6 に答える 6

4

するようにUIGestureRecognizerします。

  1. すべてのパブリック プロパティとメソッドは、UIGestureRecognizer.h

  2. 保護されたすべてのプロパティとメソッドは、UIGestureRecognizerSubclass.h. *.mこれを-filesにのみインポートします。パブリック ヘッダーには含めないでください。

  3. すべてのプライベート プロパティとメソッドは*.m-files に入ります。使用@interface ClassName ()

https://gist.github.com/hfossli/8041396

于 2013-10-11T15:28:06.277 に答える
1

実装ファイル (.m) の上に空のカテゴリを作成します。

@interface AbstractClass()

@property (nonatomic, strong) id<ButtonDelegate>buttonDelegate;

@end

そうすれば、サブクラスはそのプロパティを継承してアクセスできますが、ヘッダーにないため、他の外部クラスにはアクセスできません。

于 2013-10-11T14:49:42.340 に答える
1

プロパティ宣言を使用してこれを達成する方法はないと思います。

プロパティがすべてに対して表示されるか (.h ファイルで宣言)、すべてに対して非表示になります (カテゴリを使用して .m ファイルで宣言)。

1 つの方法は、.h ファイル クラス宣言で public/protected 変数を宣言することだと思います。

@interface AbstractClass : UIView {

   ...

   id<ButtonDelegate>buttonDelegate;

   ...
}
@end

これについてはよくわかりませんが、試してみてください。

于 2013-10-11T15:04:34.117 に答える