Как объявить дочерний класс как свойство родительского класса, который будет использоваться в связанных дочерних классах? - PullRequest
2 голосов
/ 10 июня 2009

У меня есть небольшая иерархия классов, в которой я хотел бы, чтобы дочерний класс был свойством его родительского класса и всех связанных подклассов. По сути,

  • У меня есть AbstractClass с свойство GroupClass.
  • GroupClass является ребенком AbstractClass.
  • UsableObjectClass является ребенком AbstractClass и использует GroupClass.

Если я сделаю следующее ...

#import <Cocoa/Cocoa.h>
#import "GroupingClass.h" // I've bounced this between @class as well.
@interface myAbstractClass : NSObject {
    GroupingClass* parentGroup;
}
@property (readwrite, assign) GroupingClass* parentGroup;
@end

#import "myAbstractClass.h" // ERROR LOCATION
@implementation myAbstractClass
@synthesize parentGroup;
@end

#import <Cocoa/Cocoa.h>
@interface GroupingClass : myAbstractClass {
}
@end

#import <Cocoa/Cocoa.h>  // ERROR LOCATION IN ALL CHILD CLASSES OF AbstractClass
@interface GroupingClass : myAbstractClass {
}
@end

... Я получаю этот фанк "Line Location GroupingClass.h:3: error: cannot find interface declaration for 'myAbstractClass', superclass of 'GroupingClass'" в отмеченных местах ошибок.

Я пробовал разные способы заставить это работать (да, я знаю, что вышеупомянутое абсолютно неправильно), Категории и Протоколы, кажется, правильное направление, но сейчас это становится все менее популярным, и мне действительно просто нужно толчок в правильном направлении. Я думаю, что упускаю что-то чрезвычайно фундаментальное (честно говоря, мне немного стыдно задавать этот вопрос).

В настоящее время я портирую это приложение с REALbasic, и что-то вроде этого было легким; Я мог бы просто добавить свойство в качестве дочернего класса, и это просто сработало. Объектив-С ... не так уж и много.

Любая помощь, даже просто подсказка, очень ценится!

Ответы [ 3 ]

2 голосов
/ 10 июня 2009

Вы должны иметь возможность использовать объявление @class в своем заголовке и импортировать заголовок подкласса в файл реализации.

2 голосов
/ 10 июня 2009

То, что вы ищете, - это «прямое объявление класса». В верхней части заголовка AbstractClass добавьте

@class GroupingClass;

Это говорит (к сожалению, немного архаичному) компилятору C, что будет класс с именем GroupingClass и что он может выделять пространство для переменных этого типа соответствующим образом.

0 голосов
/ 10 июня 2009

У вас есть то, что называется циклической ссылкой или зависимостью. Ваш базовый класс зависит от его дочернего класса, который, в свою очередь, зависит от базового класса.

Я предлагаю вам серьезно пересмотреть структуру своего класса.

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