Мне сложно понять частные переменные экземпляра на примере. Прочитав о частных переменных экземпляра, я пошел в Xcode и попытался проверить, как они работают.Понимание переменной частного экземпляра
В книге, которую я читаю, говорится, что если вы объявите переменную экземпляра в файле реализации суперкласса, переменная экземпляра будет закрыта и недоступна для подклассов.
Я попытался доказать, что он делает следующее без везения.
/** SuperClass interface file**/
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
-(void) setX;
-(void) printX;
@end
/**SuperClass implementation file **/
#import "ClassA.h"
@implementation ClassA
{
int x;
}
-(void) setX
{
x = 100;
}
-(void) printX
{
NSLog(@" x is equal to %i", x);
}
@end
/** interface file of subclass **/
#import "ClassA.h"
@interface ClassB : ClassA
@end
/**Main file **/
#import "ClassA.h"
#import "ClassB.h"
int main(int argc, const char * argv[])
{
@autoreleasepool
{
ClassA * a;
a = [[ClassA alloc] init];
ClassB * b;
b = [[ClassB alloc] init];
[b setX];
[b printX];
}
return 0;
}
Программа печатает следующее: х равна 100
не является «х» частной переменной экземпляра и недоступны объекта «б», потому что «х» объявляется в файле реализации суперкласса «a», а «b» - подкласс?
В книгах говорится, что «переменные экземпляра, которые должны быть доступны непосредственно подклассом, должны быть объявлены в разделе интерфейса, а не в разделе реализации ... Переменные экземпляра, объявленные или синтезированные в разделе реализации, являются частными переменными экземпляра и являются не доступными напрямую подклассами ».
Действительно смущен этим.
Я думаю, что '@implementation ClassA {int x; } 'часть не должна компилироваться. Это действительно так, как ваш код? – ThomasW
Интересно, он компилируется. Я никогда не видел эту конструкцию раньше. – ThomasW
Я просто скопировал это прямо из Xcode. Что вы видите не так с этой частью? – Brosef