Создайте подкласс класса, используя родительский init - из другого класса

Изменить: этот синдром понижения голосов здесь сосет большое время. Я задал вопрос, где, по моему мнению, показал, что сделал домашнее задание, и попросил совета. Поднятые ответы подразумевали использование предупреждений во время компиляции, в то время как мой собственный и, вероятно, самый чистый способ ООП не получил никакого интереса.

Краткий обзор, чтобы понять, зачем мне это нужно и что я пытаюсь сделать: я пишу ORM, который реализует шаблон отображения данных. Картограф (то есть для результатов SQLite) должен создать подклассы класса сущности - используя инициализатор базового класса сущности. Так что есть проблема.

Картограф не знает и не должен знать о конкретных классах. Описания отображений и конкретные сопоставители для различных источников данных абстрагируются от класса сущности и являются частью дизайна описания сущности.

Объекты похожи на NSManagedObject, хотя ORM следует другому шаблону. Описание, с которым создается любая сущность, аналогично NSEntityDescription (но также следует другому шаблону и назначению).

Поэтому моя цель - создать сущности, которые, как я знаю, являются подклассами ManagedEntity, с использованием метода init ManagedEntity.

Итак, инициализация моего картографа выглядит так:

- (id)initWithEntityClass:(Class)EntityClass entityDescriptor:(EntityDescription*)entityDescriptor
{
self = [super init];
if (self)
{
    _EntityClass = EntityClass; 
    _entityDescription = entityDescription;

    ... (assert that class is of subclass of ManagedEntity)
}

И через некоторое время в моем картографе я хочу создать конкретную сущность:

-(void)createEntityWithSQLiteResultSet:(sqlite3_stmt*)resultSet
{
    // Problem: How to init a class known to be a subclass of ManagedEntity?  
    ManagedEntity *newEntity = [[_EntityClass] alloc]     initWithEntityDescription:_entityDescription];
}

Итак, как мне создать этот дочерний класс ManagedEntity, используя init ManagedEntity?

Конечно, я мог бы использовать responsedsToSelector () для initWithEntityDescription и вызывать это. Но что-то подсказывает мне, что должен быть более элегантный способ, когда класс уже известен. Кроме того, RespondsToSelector и вызов селектора будут выполнять только проверку во время выполнения. Несмотря на то, что инициализатор сущности не должен изменяться, кажется плохим выбором потерять проверку времени компиляции, если этот метод существует.

Ответы на вопрос(2)

Ваш ответ на вопрос