Цель - C Наследование - PullRequest
       5

Цель - C Наследование

0 голосов
/ 13 декабря 2011

Я только начал изучать Цель - C ... и столкнулся с проблемой, которую я пытался решить часами ... Вот мой код ..

ClassA.h

#import <Foundation/Foundation.h>

// The ClassA Class

// @interface section
@interface ClassA: NSObject
{
    NSMutableArray *x;
}
@property (copy,nonatomic) NSMutableArray *x;
- (void) initVar;
- (void) print;
- (void) addStr: (NSString *) str;
@end

ClassA.m

#import "ClassA.h"

// @implementation section
@implementation ClassA

@synthesize x;
- (void) initVar
{
    x = [[NSMutableArray alloc] init];
}

- (void) print
{ 
    for(NSString *str in x)
        NSLog (@" --------- %@", str);

}

- (void) addStr: (NSString *) str
{
    if(![x containsObject: str])
        [x addObject: str];
}
@end

ClassB.h

#import "ClassA.h"

// The ClassB Class

// @interface section
@interface ClassB: ClassA
{
    NSMutableArray *y;
}
- (void) initVar;
- (void) print;
- (void) addStr: (NSString *) str;
@end

ClassB.m

#import "ClassB.h"

// @implementation section
@implementation ClassB

- (void) initVar
{
    y = [[NSMutableArray alloc] init];
}

- (void) print
{ 
    for(NSString *str in y)
        NSLog (@" />>>>>>>>> %@", str);
}

- (void) addStr: (NSString *) str
{
    if(![self.x containsObject: str] && ![y containsObject: str])
    {
        [self.x addObject: str];
        [y addObject: str];
    }
    else if([self.x containsObject: str] && ![y containsObject: str])
    {
        [y addObject: str];
    }
}

@end

Вот где я звоню на занятия

#import "./MyClasses/ClassB.h"

int main(int argc, const char * argv[])
{
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSLog (@"This will print!");
    ClassB *b = [[ClassB alloc] init];
    ClassA *a = [[ClassA alloc] init];

    [a initVar];
    [a addStr: @"obj1"];
    [a addStr: @"obj2"];
    [a addStr: @"obj3"];
    [a print];

    [b initVar];
    [b addStr: @"YOH1"];
    [b addStr: @"YOH2"];
    [b addStr: @"YOH3"];
    [b print];

    NSLog (@" +++++++++++++++++++++++++++++++++ ");

    [a print];

    [a release];
    [b release];
        [pool drain];
        return 0;
}

Я хочу, чтобы это выглядело так ...

Это напечатает! ------------ obj1

------------ obj2

------------ obj3

/ >>>>>>>>>>>> YOH1

/ >>>>>>>>>>>> YOH2

/ >>>>>>>>>>>> YOH3

++++++++++++++++++++++++++++++++++++

------------ obj1

------------ obj2

------------ obj3

------------ YOH1

------------ YOH2

------------ YOH3


На данный момент последние 3 выхода (YOH1, YOH2 и YOH3) не отображаются. Это означает, что я не добавил объект в x успешно. Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Таким образом, объект 'b' даже не имеет NSMutableArray в 'x'. «x» будет нулем для объекта «b».

Но я подозреваю, что здесь другое недоразумение. Объект «b» и объект «a» - это два разных объекта. Тот факт, что класс B является подклассом A, не означает, что добавление строк в некоторый экземпляр класса B приведет к добавлению этих строк в некоторый другой экземпляр класса A.

Чтобы ответить на ваш вопрос в комментариях, предположим, что вы хотите, чтобы каждый экземпляр класса B имел свой собственный NSMutableArray в «x». Вы можете сделать это так:

// in ClassA.h
@interface ClassA: NSObject {
   NSMutableArray *x;
}

@property (retain,nonatomic) NSMutableArray *x;
@end

// in ClassA.m

@implementation ClassA
@synthesize x;

- (id)init {
    if ((self = [super init])) {

      x = [[NSMutableArray alloc] init];
      // whenever we init an instance of class A, we will have
      // an nsmutablearray in 'x'
    }
    return self;
}

- (void)dealloc {

   // assume you aren't using ARC
   [x release];
   [super dealloc];
 }

// in ClassB.h
@interface ClassB: ClassA {
   NSMutableArray *y;
}

@property (retain,nonatomic) NSMutableArray *y; // for consistency
@end

// in ClassB.m

@implementation ClassB
@synthesize y;

- (id)init {
    if ((self = [super init])) { // call Class A's init

      y = [[NSMutableArray alloc] init];
      // whenever we init an instance of class B, we will have
      // everything an instance of A has, plus this y we need
    }
    return self;
}

- (void)dealloc {

    // assume you aren't using ARC
    [y release];
    [super dealloc];
}

Я переместил ваш initVar в надлежащий init, нет причин иметь там два метода. И я просто показываю только init, оставляя addString и print.

Так что теперь вы можете сделать это:

ClassB *instanceOfB = [[ClassB alloc] init];

и у этого экземпляра будут нужные вам массивы x и y.

Я также оставил там объявления переменных экземпляра, хотя они не обязательны для новых компиляторов. Более новые версии компилятора могут неявно определять эти переменные экземпляра. Если вы этого не понимаете, не беспокойтесь об этом. Не так важно.

Надеюсь, это поможет.

0 голосов
/ 13 декабря 2011

Но вы не добавили YOH1, YOH2 и YOH3 к a, не так ли?

Кроме того, x не будет инициализировано для класса B.

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