Можно ли иметь массив объектов «Суперкласса» в классе? - PullRequest
1 голос
/ 29 марта 2012

По сути, я хочу написать класс для разбора XML-документа для моих приложений для iphone.

Вот мой файл заголовка для парсера, который анализирует ленту новостей

@interface NewsXML : NSObject<NSXMLParserDelegate>
{
@private
    NSXMLParser *xmlParser;

    NSString *currentElement;
    NSMutableString *currentTitle;
    NSMutableString *currentDate;
    NSMutableString *currentDetail;
    NSMutableString *currentImageURL;
    NSMutableString *currentThumbnailURL;
    NSMutableString *currentAlt;
}

@property (nonatomic, assign) NSObject<NewsXMLDelegate> *delegate;
@property (nonatomic, strong) NSMutableArray *newsItems;
@property (nonatomic, strong) NSURL *url;

- (void)fetch;

@end

Существует массив newsItems, который содержит извлеченные объекты из XML после того, как метод fetchnamed.

Однако в моей программе есть несколько типов XML-файлов, которые я бы хотел проанализировать. Каждый тип XML-файла имеет свои поля. (Например: заголовок, дата, подробности и т. д.)

Я создаю другой класс (например, NewsItem, FooItem, AbcItem) для хранения элементов из разных файлов XML.

Я до сих пор не могу понять, как сделать этот класс XML-анализатора более общим, чтобы NSMutableArray элементов могхранить разные типы элементов (NewsItem, FooItem ..) для каждого случая. Теперь мне нужно написать разные классы синтаксического анализатора XML для каждого файла XML.

Итак, как это можно сделать в более общем виде?

РЕДАКТИРОВАТЬ

Извините за неясность. Когда синтаксический анализатор анализирует каждый элемент, он создаст новый объект, такой как «NewsItem», «FooItem» для хранения данных и т. Д.Затем добавьте его в массив.Однако класс синтаксического анализатора не должен знать о существовании этих классов (поскольку все больше и больше классов элементов будет добавлено позже).Тогда как этот класс парсера xml может создавать правильные объекты и правильно добавлять их в массив?Есть ли способ инициализировать класс парсера классом элемента?

1 Ответ

2 голосов
/ 29 марта 2012

После прочтения вашего комментария я не думаю, что то, что вы имеете в виду, является хорошим дизайном для классов. Я думаю, что синтаксический анализатор XML должен просто анализировать XML стандартным способом и всегда возвращать одно и то же, и ваши классы (такие как NewsItem, FooItem и т. Д.) Должны знать, как создавать себя с проанализированным XML. Это гораздо надежнее.

Я делаю это в нескольких приложениях, которые я сделал. Мои классы NewsItem или FooItem реализуют функцию, которая выглядит следующим образом:

- (id)initWithXMLData:(NSDictionary *)xmlDataDictionary {
    self.fooVar = [xmlDataDictionary objectForKey@"xmlParsedKey"];
    //And so on for whatever you need to set from the xml data
}

Таким образом, анализируемые данные XML всегда одинаковы (вы не изменяете синтаксический анализатор XML), и если вам нужен класс для обработки данных по-другому, вы изменяете собственную функцию класса initWithXMLData вместо изменения синтаксического анализатора XML , Синтаксический анализатор XML никогда не должен знать о существовании каких-либо других классов.

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