Подкласс Objective C и кастинг базового класса

Я собираюсь создать базовый класс, который реализует очень похожие функции для всех подклассов. Этому ответили в другом вопросе. Но то, что я должен знать теперь, - то, если/как я могу бросить различные функции (в базовом классе) для возврата объекта подкласса. Это оба для заданной функции, но также и вызова функции в ней.

(Я работаю с CoreData между прочим),

Как функция в базовом классе (это от класса, который собирается стать моим подклассом),

+(Structure *)fetchStructureByID:(NSNumber *)structureID inContext:(NSManagedObjectContext *)managedObjectContext {...}  

И как вызов функции в заданной функции:

Structure *newStructure = [Structure fetchStructureByID:[currentDictionary objectForKey:@"myId"]];
                                              inContext:managedObjectContext];

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

Как я делаю это?

Обновление: Я просто понял, что во второй части существует на самом деле две проблемы. Вы не можете изменить [Выборку структуры...] к [сам выборка...], потому что это - метод класса, не метод экземпляра. Как я обхожу это также?

1
задан Community 23 May 2017 в 11:55
поделиться

1 ответ

Если я правильно понял ваш вопрос, я полагаю, что ключом является идиома [self class].

Что касается вашего обновления, то, запрашивая способ вызова метода класса в текущем классе, вы можете использовать [self class]. Например:

Structure *newStructure = [[self class] fetchStructureByID:[currentDictionary 
                                              objectForKey:@"myId"]];
                                                 inContext:managedObjectContext];

EDIT: Я переделал это, чтобы возвращать id согласно комментарию @rpetrich - намного чище и избавляет от необходимости -isKindOfClass:, пока вы уверены в типе экземпляра, для которого вызываете -createConfiguredObject.

Что касается первой части, вы можете просто вернуть id (указатель на любой объект) и задокументировать, что он вернет экземпляр того же класса, на который он вызван. Затем в коде вам нужно использовать [self class] везде, где вы инстанцируете новый объект в методе.

например. если у вас есть метод -createConfiguredObject, который возвращает экземпляр того же класса, на котором он вызван, он будет реализован следующим образом:

// Returns an instance of the same class as the instance it was called on.
// This is true even if the method was declared in a base class.
-(id) createConfiguredObject {
    Structure *newObject = [[[self class] alloc] init];
    // When this method is called on a subclass newObject is actually
    // an instance of that subclass
    // Configure newObject
    return newObject;
}

Затем вы можете использовать это в коде следующим образом:

StructureSubclass *subclass = [[[StructureSubclass alloc] init] autorelease];
subclass.name = @"subclass";

// No need to cast or use isKindOfClass: here because returned object is of type id
// and documented to return instance of the same type.
StructureSubclass *configuredSubclass = [[subclass createConfiguredObject] autorelease];
configuredSubclass.name = @"configuredSubclass";

Для справки, то, что я имел в виду с -isKindOfClass: и приведение к нужному подклассу выглядит так:

Structure *structure;
// Do stuff
// I believe structure is now pointing to an object of type StructureSubclass
// and I want to call a method only present on StructureSubclass.
if ([structure isKindOfClass:[StrucutreSubclass class]]) {
    // It is indeed of type StructureSubclass (or a subclass of same)
    // so cast the pointer to StructureSubclass *
    StructureSubclass *subclass = (StructureSubclass *)structure;
    // the name property is only available on StructureSubclass.
    subclass.name = @"myname";
} else {
    NSLog(@"structure was not an instance of StructureSubclass when it was expected it would be.");
    // Handle error
}
2
ответ дан 2 September 2019 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: