ios - 如何通过 ios 中的继承访问私有(private)声明的属性

标签 ios objective-c

我不明白为什么我不能访问子类 SetCardCardgameViewController 中的 self.cardButtons。父级是 CardgameViewController。

CardgameViewController.h:

 #import <UIKit/UIKit.h>
#import "Deck.h"

@interface CardgameViewController : UIViewController
- (void) updateUI;

//  protected
//  for subclasses

- (Deck *)createDeck;

// must be overriden in SetCardGameViewController as contents is not to be used for    instance
- (NSAttributedString *)titleForCard: (Card *)card;
- (UIImage *)backgroundImageforCard: (Card *)card;

@end

CardgameViewController.m

#import "CardgameViewController.h"
//#import "PlayingCardDeck.h"
#import "CardMatchingGame.h"

@interface CardgameViewController ()

@property (strong, nonatomic) CardMatchingGame *game;
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;
@property (weak, nonatomic) IBOutlet UILabel *scoreLabel;
@property (weak, nonatomic) IBOutlet UISegmentedControl *matchMode;
@property (weak, nonatomic) IBOutlet UILabel *status;
@property (weak, nonatomic) IBOutlet UISlider *historySlider;
@property (weak, nonatomic) IBOutlet UILabel *historyOverview;

@end

SetCardCardgameViewController.h

#import "CardgameViewController.h"

@interface SetCardCardgameViewController : CardgameViewController

@end

SetCardCardgameViewController.m

#import "SetCardCardgameViewController.h"
#import "SetCardDeck.h"
#import "SetCard.h"

@interface SetCardCardgameViewController ()

@end

@implementation SetCardCardgameViewController

- (void)updateUI
{
    for (UIButton *cardButton in self.cardButtons) {

}

}

无法识别最后一个 self.cardButtons。但是 cardButtons 是父类的一个属性。为什么不被认可?我同意它是私下声明的,但由于 SetCardCardgameViewController 是 CardgameViewController 的子项,我认为我可以访问它的所有属性和方法。还是我弄错了?

最佳答案

您将私有(private)范围误认为是 protected 。

从语义上讲,由于 Objective-C 的动态特性,不存在私有(private)或 protected 范围之类的东西。您可以按照上面的方式模拟私有(private)范围;但是,在 .m 文件中声明的方法或属性不能被其子类看到。将它们放在您的头文件中会使它们公开,并且通常是最常用的途径。如果你绝对必须保护这些方法/属性,你可以将该接口(interface)添加到一个单独的头文件中,然后将它们导入你的子类中,如下所示:

CardgameViewController_Internal.h

@interface CardgameViewController (Private)

@property (strong, nonatomic) CardMatchingGame *game;
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;
@property (weak, nonatomic) IBOutlet UILabel *scoreLabel;
@property (weak, nonatomic) IBOutlet UISegmentedControl *matchMode;
@property (weak, nonatomic) IBOutlet UILabel *status;
@property (weak, nonatomic) IBOutlet UISlider *historySlider;
@property (weak, nonatomic) IBOutlet UILabel *historyOverview;

@end

然后在 SetCardCardgameViewController.m 中:

#import "SetCardCardgameViewController.h"
#import "SetCardDeck.h"
#import "SetCard.h"
#import "CardgameViewController_Internal.h"

@implementation SetCardCardgameViewController

- (void)updateUI
{
    for (UIButton *cardButton in self.cardButtons) { 

    }
}

@end

关于ios - 如何通过 ios 中的继承访问私有(private)声明的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23093607/

相关文章:

ios - swift iOS : fatal error when dismissing alert controller while keyboard is up

iphone - 谷歌驱动器直接链接到文件

iOS 如何播放 midi 音符?

ios - 在 UITableViewCell 的边界之外绘制

ios - 一种从内存中添加/删除/编辑词典的方法

iPhone 应用程序构建到模拟器,不会构建到设备

ios - iPhone - 将 CTFont 转换为 UIFont?

ios - 核心数据关系,如何从关系中插入和检索数据

ios - 检查字符串是否包含数字

iphone - Objective C - 将对象数组(带有日期字段)转换为数组字典(按星期几键控)