Получить тип класса в методе shared target? - PullRequest
0 голосов
/ 09 июля 2010

В Objective-C есть метафора Alloc / Init. Они также добавили общий удобный метод под названием «new», который внутренне просто вызывает оба подряд. И если я создаю подкласс NSObject с именем FooClass, FooClass выбирает эти общие методы, в том числе 'new'.

НО ... как, черт возьми, это реализовано ??

Он не может просто делегировать базовому классу, потому что это просто создаст экземпляр экземпляра NSObject, а не вашего производного класса FooClass, но он все еще работает! Так как бы кто-нибудь написать что-то подобное?

Другими словами, базовый класс не должен быть таким ...

  + (id) somethingLikeNew{
        return [[NSObject alloc] init];  
    }

А точнее это ...

  + (id) somethingLikeNew{
        return [[<SomethingThatMapsToFooClassType> alloc] init];  
    }

... где 'SomethingThatMapsToFooClassType' - это тип производного класса, который наследуется от NSObject и который должен подобрать общий метод'thingLikeNew '.

По сути, я добавляю категорию из NSObject, и у меня есть общие методы, которые должны знать тип, но все реализации являются общими, поэтому я делаю категорию в NSObject, а не везде в моих файлах классов ( точно так же, как у тебя нет «нового» повсюду. Это просто там.)

Кто-нибудь? Bueller? Bueller

M

Ответы [ 2 ]

7 голосов
/ 09 июля 2010

В любом методе Objective C параметр self (неявный) относится к получателю.В случае метода класса self является объектом Class.Таким образом, полиморфные методы класса могут быть реализованы как

+ (id)somethingLikeNew
{
   return [[self alloc] init];
}
0 голосов
/ 09 июля 2010

Ха! Нашел сам через две секунды после публикации! Вы можете использовать «self» в совместно используемом методе для представления типа класса для производного класса, поэтому вышеприведенное будет просто ...

  + (id) somethingLikeNew{
        return [[self alloc] init];  
    }

Черт, это было легко! Надеюсь, это поможет кому-то еще!

M

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...