Не удалось получить такое же поведение статической переменной в c ++ с целью C - PullRequest
0 голосов
/ 30 апреля 2011

В 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

1 Ответ

1 голос
/ 06 мая 2011
// ClassA.h
@interface ClassA : NSObject { }

+ (void)setFoo:(int)aFoo;
+ (int)foo;

@end

// ClassA.m
static int foo;

@implementation ClassA

+ (int)foo { return foo; }
+ (void)setFoo:(int)aFoo { foo = aFoo; }

@end

// ClassB.h
#import "ClassA.h"
@interface ClassB : ClassA { }
@end

// ClassB.m
#import "ClassB.h"
@implementation ClassB
@end

// main
ClassA *a = [[ClassA alloc] init];
[[a class] setFoo:42];
NSLog(@"%d", [[a class] foo]);

ClassB *b = [[ClassB alloc] init];
[[b class] setFoo:265];
NSLog(@"%d", [[a class] foo]);

Журнал консоли:

2011-05-06 20:52:07.092 test[17417:207] 42
2011-05-06 20:52:07.094 test[17417:207] 265

Это поведение, которое вы хотите достичь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...