Erstellen Sie eine Unterklasse einer Klasse mit dem übergeordneten Init - aus einer anderen Klasse

Edit: Dieses Downvoting-Syndrom hier nervt. Ich stellte eine Frage, wo ich meiner Meinung nach zeigte, dass ich meine Hausaufgaben gemacht hatte, und bat um Rat. Die überarbeiteten Antworten implizierten Warnungen bezüglich der Kompilierungszeit, während meine eigene und wahrscheinlich sauberste OOP-Methode kein Interesse fand.

Kurzer Überblick, um zu verstehen, warum ich das brauche und was ich versuche: Ich schreibe ein ORM, das das Data-Mapper-Muster implementiert. Ein Mapper (d. H. Für SQLite-Ergebnisse) muss Unterklassen einer Entitätsklasse erstellen - unter Verwendung des Initialisierers der Basisentitätsklasse. Da ist also das Problem.

Der Mapper kennt und sollte bestimmte Klassen nicht kennen. Zuordnungsbeschreibungen und spezifische Zuordnungen für verschiedene Datenquellen werden von der Entitätsklasse und vom Entwurf her als Teil der Entitätsbeschreibung abstrahiert.

Entitäten ähneln NSManagedObject, obwohl der ORM einem anderen Muster folgt. Die Beschreibung, mit der eine Entität erstellt wird, ähnelt NSEntityDescription (folgt jedoch auch einem anderen Muster und Zweck).

Mein Ziel ist es daher, mithilfe der init-Methode von ManagedEntity Entitäten zu erstellen, von denen ich weiß, dass sie Unterklassen von ManagedEntity sind.

Das Init meines Mapper sieht also so aus:

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

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

Und einige Zeit später in meinem Mapper möchte ich dann die konkrete Entität erstellen:

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

Wie erstelle ich diese untergeordnete Klasse von ManagedEntity mit dem Init von ManagedEntity?

Klar, ich könnte responsondsToSelector () für initWithEntityDescription verwenden und das aufrufen. Aber irgendetwas sagt mir, dass es einen eleganteren Weg geben sollte, wo die Klassenart bereits bekannt ist. Außerdem führen responsondsToSelector- und Selector-Aufrufe nur eine Laufzeitprüfung durch. Obwohl sich der Entitätsinitialisierer nicht ändern sollte, scheint es eine schlechte Wahl zu sein, die Überprüfung der Kompilierzeit zu verlieren, wenn diese Methode vorhanden ist.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage