Создайте подкласс класса, используя родительский 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 и вызов селектора будут выполнять только проверку во время выполнения. Несмотря на то, что инициализатор сущности не должен изменяться, кажется плохим выбором потерять проверку времени компиляции, если этот метод существует.