Инициализация подкласса в цели c

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

+ (id) load
{
    Class c = [self class];
    NSString *cString = NSStringFromClass([self class]);
    NSLog(@"%@",cString);

    id a = [[c alloc] init];
    [a autorelease];
    return a;
}

Результатом [self class] здесь является суперкласс, но я хочу инициализировать сам класс (в этом случае он всегда будет подклассом). Возможно, это просто ужасная идея программирования.


person user1122069    schedule 29.07.2012    source источник
comment
Есть ли какая-то особая причина, по которой вам нужно инициализировать подкласс из суперкласса? Оба класса инициализируются перед созданием любого экземпляра любого класса или вызовом любого статического метода.   -  person Francisco Silva    schedule 30.07.2012
comment
Вы говорите о создании класса Singleton?   -  person I am Root.    schedule 30.07.2012
comment
Расскажите нам, чего вы пытаетесь достичь, и мы, возможно, сможем предложить лучший способ сделать это. В нынешнем виде я понятия не имею, чего вы пытаетесь достичь, и поэтому не могу помочь!   -  person Sedate Alien    schedule 30.07.2012
comment
Я с @FranciscoSilva в этом, это действительно не имеет никакого смысла. Если вам нужен экземпляр вашего подкласса, инициализируйте свой подкласс. Супер не должен ничего знать о своих подклассах.   -  person sosborn    schedule 30.07.2012
comment
скажем, у меня был класс a с определенными действиями, которые нужно запускать при инициализации, и он сохраняет себя и освобождается, когда это будет сделано. поэтому класс b наследуется от класса a, поэтому каждый раз, когда я хочу использовать класс b, c или d и т. д., я должен набирать [[[b alloc] init] release], что для меня немного неприглядно, а то, что он делает, — нет. так очевидно. Я хотел бы заменить [[[b alloc] init] release] на [b load], но я хотел бы определить load в a, иначе копировать и вставлять load в b,c,d — пустая трата времени ( наследующий от а).   -  person user1122069    schedule 31.07.2012


Ответы (1)


Я должен набрать [[[b alloc] init] release], что мне немного неприглядно и не так очевидно, что оно делает.

Я не согласен. Совершенно очевидно, что делает этот код. Он выделяет класс B (кстати, классы следует писать с большой буквы), инициализирует его, а затем освобождает.

[б загрузка]

С другой стороны, мне это ни о чем не говорит, кроме того факта, что b загружается. Что загружается? Он выделяет и инициализирует?

Я хотел бы определить нагрузку в a, иначе это пустая трата времени на копирование и вставку загрузки в b, c, d (наследование от a)

Это неприглядно, и то, что это делает, не так очевидно. Кроме того, классы действительно не должны ничего знать о своих подклассах.

ИМХО, ваше решение не очень хорошее. Способ сделать это будет заключаться в том, чтобы суперкласс имел метод загрузки (я бы предпочел назначенный инициализатор с более описательным именем), который имеет все общие функции. Затем в ваших подклассах переопределите ваш метод загрузки, чтобы вызвать реализацию super, а затем добавьте любой код, который вам нужен для этого конкретного подкласса.

person sosborn    schedule 31.07.2012
comment
Основываясь на вашем ответе, это можно сделать для реализации метода подкласса, который вернет свой класс. Я на самом деле уже использую такой шаблон. Нагрузка очевидна для меня, и, поскольку она не включает в себя отчужденные или новые, я знаю, что не являюсь владельцем объекта. - person user1122069; 01.08.2012