Crie uma subclasse de uma classe usando o init do pai - de outra classe

Edit: Este syndrom downvoting aqui é uma merda grande momento. Fiz uma pergunta em que, na minha opinião, mostrei que fiz meu dever de casa e pedi conselhos. As respostas votadas implicavam em avisos de tempo de compilação, enquanto meu próprio jeito, e provavelmente o mais limpo, não recebia nenhum interesse.

Visão geral resumida para entender por que preciso disso e do que tento fazer: Estou escrevendo um ORM que implementa o padrão de mapeamento de dados. Um mapeador (ou seja, para resultados de SQLite) deve criar subclasses de uma classe de entidade - usando o inicializador da classe de entidade base. Então, há o problema.

O mapeador não conhece e não deve saber sobre classes específicas. Descrições de mapeamento e mapeadores específicos para diferentes origens de dados são abstraídos da classe de entidade e por parte do design da descrição da entidade.

As entidades são semelhantes a NSManagedObject, embora o ORM siga um padrão diferente. A descrição com a qual qualquer entidade é criada é semelhante a NSEntityDescription (mas também segue um padrão e uma finalidade diferentes).

Portanto, meu objetivo é criar entidades que conheço como subclasses de ManagedEntity, usando o método init de ManagedEntity.

Então o init do meu mapeador se parece com isso:

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

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

E algum tempo depois, no meu mapeador, eu quero criar a entidade concreta:

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

Então, como eu crio essa classe filha de ManagedEntity, usando o init de ManagedEntity?

Claro, eu poderia usar respondsToSelector () para initWithEntityDescription e invocar isso. Mas algo me diz que deveria haver uma maneira mais elegante, onde o tipo de classe já é conhecido. Além disso, responsToSelector e a chamada do seletor farão apenas uma verificação de tempo de execução. Mesmo que o inicializador de entidade não deva mudar, parece uma má escolha perder tempo de compilação, verificando se esse método existe.

questionAnswers(2)

yourAnswerToTheQuestion