2013-05-18 3 views
0

Супер класс ResourceКак получить доступ к переменным класса супер в методе инициализации

@interface Resource : CoderObject 

@property (strong, nonatomic) NSString *resourceID; 
@property (assign, nonatomic) ResourceType resourceType; 
@property (assign, nonatomic) DataType dataType; 

@end 

Подкласс ViewResource

@interface ViewResource : Resource 

@property (strong, nonatomic) CustomView *view; 
@property (strong, nonatomic) UIViewController *viewController; 

@end 

В подклассе ViewResource 's init метод, как получить доступ Resource' s переменной dataType? Теперь я пытаюсь просто использовать super.dataType = ...

Есть ли другие способы?

ответ

2

Вам просто нужно использовать self.dataType. Ваш подкласс имеет полную видимость всех свойств суперкласса, определенных в файле .h. Использование self.xxx также дает возможность переопределить методы доступа, если это необходимо в будущем, не возвращаясь, чтобы отредактировать весь ваш код использования.

Посмотрите на вашу ссылку ниже, достаточно справедливую. Это все действительные баллы. У аксессуаров не должно быть побочных эффектов, но вы не можете гарантировать, что они не будут. Если свойство определяется суперкласса, то у вас есть несколько вариантов:

  1. Используйте self.xxx, чтобы установить свойство и стремиться обеспечить отсутствие побочных эффектов
  2. Вызов метод инициализации на супер, передавая необходимые параметры, и установить их там
+0

Но я слышал, что вы не должны называть 'self.method' в методе' init'? – sunkehappy

+1

Какая причина была дана? Предпочтительно использовать методы доступа для установки значения. Единственный раз, когда вы не должны использовать аксессор, - это когда вы находитесь внутри устройства доступа. – Wain

+0

Проверьте эту ссылку: http: //developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW11 – sunkehappy

0

Как Wain заявил в своем ответе у вас есть прямой доступ к членам класса вашего супер (если они не являются частными).

И нет никаких проблем вызова self.property в методе инициализации до тех пор, как ваш инициализационный выглядит следующим образом

-(id)initAndTheNameYoWantAndMaybeSomeParameters:(NSString *)paramExample { 
    self = [super initNameOfAnInitMethodFromSuperClass]; 
    //check if the init was with success 
    if(self != nil) { 
     self.myStringProp = paramExample; 
     //or 
     self.propertyFromSuper = paramExample; 
    } 
} 

Да, вы можете также сделать глупые вещи в initMethods (я сделал это раньше :))) как вызов того же initMethod изнутри, который генерировал рекурсивный вызов, который разбивал мое приложение. (Легко обнаружить эту проблему)

Смежные вопросы