2013-09-11 4 views
0

У меня есть суперкласс, SuperClassYeh и подкласс SubClassYeh. У меня есть метод inheritTest в SuperClassYeh, и я переопределяю inheritTest в SubClassYeh. Я запускаю программу, вызывая метод testSuperAndSelf в SubClassYeh. Этот метод вызвал бы другой метод: fromYEH в SuperClassYeh. В fromYEH, я хотел бы позвонить inheritTest в SuperClassYeh. Как мне это сделать? Использование [self inheritTest] вызывает inheritTest в SubClassYeh, а не SuperClassYeh.

Вот фрагмент кода, чтобы начать все это работаетКак вызвать метод в том же классе

SubClassYeh *testing = [[SubClassYeh alloc] init]; 
[testing testSuperAndSelf]; 

Вот фрагмент кода для SuperClassYeh

- (void) fromYEH 
{ 
    [self inheritTest]; //Calls the inheritTest in SubClassYeh, not SuperClassYeh 
} 

- (void) inheritTest 
{ 
    NSLog(@"Testing Indicator. Inside SuperClassYEH inheritTest"); 
} 

Вот фрагмент кода для SubClassYeh

- (void) inheritTest 
{ 
    NSLog(@"Testing Indicator. Inside SubClassYeh inheritTest"); 
} 

- (void) testSuperAndSelf 
{ 
    [super fromYEH]; 
} 
+0

только один вопрос. зачем вам это нужно? это немного странное поведение. – Morion

ответ

0

Я нашел решение.Вместо того, чтобы звонить [super fromYeh] в testSuperAndSelf, замените ресивер на суперкласс. Используйте [[[[SubClassYeh superclass] alloc] init] fromYEH]. Внутри метода fromYEH будет называться inheritTest из SuperClassYEH.
Вот фрагмент кода для метода testSuperAndSelf в SubClassYeh. Остальные коды остаются прежними.

- (void) testSuperAndSelf 
{ 
    [[[[SubClassYeh superclass] alloc] init] fromYEH]; 
} 
0

Если вы можете позвонить [super fromYEH] от SubClassYeh, в чем проблема при вызове [super inheritTest] того же путь?

+0

Не работает. Вы не можете вызвать [super inheritTest] в fromYeh, который уже находится в SuperClassYeh. – CodeHelp

+0

Можете ли вы не называть [super inheritTest]; от метода testSuperAndSelf? – thatzprem

5

Вы не можете,, и это предполагаемое поведение наследования в Objective-C.

Если self является экземпляром SubClassYeh, то

[self inheritTest] 

называет SubClassYeh реализацию inheritTest (если таковой имеется), независимо от того, откуда это сообщение посылается (подкласс или суперкласс).

Единственное различие между [super fromYEH] и [self fromYEH] является то, что поиск для сообщения «fromYEH» начинается в суперкласса, но это не меняет того факта, что self является экземпляром SubClassYeh.

И вы не можете предотвратить метод от быть переопределен в Objective-C (см How to avoid superclass methods getting overridden by sub class in objective - c или другого Q & элементов а об этой теме).

Единственное, что вы можете сделать в суперкласса, чтобы выбрать метод имена , которые не перекрываться случайно, например, путем префикса имени метода с именем класса, как предлагается здесь: https://stackoverflow.com/a/17209309/1187415.

0

Даже это довольно странное поведение, вы можете попробовать что-то вроде этого (не проверял, на самом деле)

- (void) fromYEH 
{ 
    bool isSubClass = [self isKindOfClass:[SubClassYeh class]]; 
    if(isSubClass == YES) 
    { 
     [super performSelector:@selector(inheritTest)]; 
    } 
    else 
    { 
     [self inheritTest]; 
    } 
} 

В любом случае, даже если этот код действительно будет делать трюк, я до сих пор считаю, что это очень плохая практика.


EDIT:

Проверено это в XCode. Это не будет делать трюк =) Итак, поддержал ответ Мартина =)

+1

Некоторые замечания: 1) '[super отвечаетSoSelector: ...]' не делает то, что вы думаете. Он возвращает true, даже если 'self', но не суперкласс реализует этот метод. - 2) 'isBaseClass' всегда будет YES, вы, вероятно, имели в виду' isMemberOfClass'? - 3) '[super inheritTest]' не компилируется, вам придется использовать 'performSelector'. - 4) Что делать, если 'self' является экземпляром под-подкласса? –

+0

Да, вы правы. Сделано несколько изменений. И в этом случае есть шанс получить исключение «непризнанного селектора». Кроме того, это правда, что этот метод будет работать неправильно в случае под-подкласса. – Morion

+0

Извините, что продолжал оскорблять вас, но '[super performSelector: ...]' также не работает так, как вы думаете. –

0

Просто для записи ...

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

Все, что вам нужно сделать, это определить функцию C и вызвать ее.

- (void) fromYEH 
{ 
    inheritTest(self); //Calls the inheritTest() in SuperClassYeh 
} 

void inheritTest(SuperClassYeh *self) 
{ 
    NSLog(@"Testing Indicator. Inside SuperClassYEH inheritTest"); 
}  

- (void) inheritTest 
{ 
    inheritTest(self); 
} 

(я люблю имена ...;)

Смежные вопросы