В C ++, если переменная объявлена как статическая переменная внутри класса и если ее переменная изменена унаследованным подклассом, тогда при обращении к переменной с помощью объекта суперкласса будет получено измененное значение.
В Objective C мы объявляем статическую переменную, как мы делаем в объявлении C.
Таким образом, здесь переменная, к которой обращается объект производного класса, имеет отдельную копию переменной и ту же самую переменнуюхотя доступ к базовому классу не дает значения, которое изменяется объектом производного класса.
Что я должен изменить, чтобы изменение, внесенное производным классом в переменную ab, также отражалось при доступе к немучерез базовый класс?
ClassA.h
-----------
#import <Foundation/Foundation.h>
static int ab;
@interface ClassA : NSObject {
int a;
}
+ (void) initialize;
- (id) init;
- (void) displayNumOfInstance;
- (void) disp;
@end
ClassA.m
------------
#import "ClassA.h"
@implementation ClassA
+ (void) initialize
{
ab=0;
}
- (id) init
{
self = [super init];
if (self!=nil) {
ab=30;
}
return self;
}
- (void) displayNumOfInstance
{
NSLog(@"Number of instances of this class:%d",ab);
}
- (void) disp
{
NSLog(@"The value is %d",ab);
}
@end
ClassB.h
--------
#import <Foundation/Foundation.h>
#import "ClassA.h"
@interface ClassB : ClassA {
}
- (void) display;
@end
ClassB.m
--------
#import "ClassB.h"
@implementation ClassB
- (void) display
{
ab=20;
NSLog(@"The value ab is %d",ab);
}
@end
class2.m
---------
#import <Foundation/Foundation.h>
#import "ClassA.h"
int main (int argc, const char * argv[]) {
ClassA *a = [[ClassA alloc]init];
[a disp];
[a release];
ClassB *b = [[ClassB alloc]init];
[b display];
[b release];
ClassA *a1 = [[ClassA alloc]init];
[a1 disp];
[a1 release];
ClassB *b1 = [[ClassB alloc]init];
[b1 display];
[b1 release];
return 0;
}
output:
---------
2011-04-30 15:31:42.490 class2[1674:a0f] 30
2011-04-30 15:31:42.493 class2[1674:a0f] The value ab is 20
2011-04-30 15:31:42.494 class2[1674:a0f] 30
2011-04-30 15:31:42.495 class2[1674:a0f] The value ab is 20