2013-09-03 5 views
0

Мой суперкласс определяет частный метод, называемый «commonInit», который вызывается только при построении.UIVIew объект суперкласса, вызывающий метод подкласса вместо метода в своей области

супер класс является производным от 2-х дополнительных классов, каждый из которых также реализуют метод, называемый «commonInit»

При строительстве объектов производного класса, я вижу в отладчике, что метод подкласса вызывается из объем суперкласса.

Это, кажется, очень опасное поведение - даже в тривиальном случае, когда на coincedence вы «перезаписать» вашего суперкласс частного метода

Как я могу преодолеть это поведение без переименования метода в родительском классе?

Пример:

@interface ASuperView : UIView 
@end 

@implementation ASuperView 
-(id)init 
{ 
    self = [super init]; 
    if(self) 
    { 
    [self commonInit]; // BOOM - The derived view method is called in this scope 
    } 
    return self; 
} 

-(id)initWithFrame:(CGRect)frame 
{ 
self = [super initWithFrame:frame]; 
    if(self) 
    { 
    [self commonInit]; 
    } 
    return self; 
} 

-(void)commonInit 
{ 
    //setup the view 
} 

@end 

@interface ADerivedView : ASuperView 

@end 

@implementation ADerivedView 
-(id)init 
{ 
    self = [super init]; 
    if(self) 
    { 
    [self commonInit]; 
    } 
    return self; 
} 

-(id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if(self) 
    { 
    [self commonInit]; 
    } 
    return self; 
} 

-(void)commonInit 
{ 
    //setup the view for the derived view 
} 
@end 

В этом изображении PXTextMessageBox, полученном из PXTextBox

Оба объявить частные методы общей инициализации

enter image description here

+0

Сравнить http://stackoverflow.com/questions/2863982/how-to-avoid-overriding-of-methods-in-subclass-in-objective-c или http://stackoverflow.com/questions/2864273/ как к избегаю-суперкласс-методы добывания-переопределен-на-суб-класс-в-Objective-C. –

ответ

1

В obj-c нет такой вещи, как «частные» методы. В лучшем случае вы можете скрыть существование метода от потребителей вашего заголовка, но по дизайну любой, у кого есть ссылка на ваш объект, может вызывать любой метод, который он реализует, даже если у них нет этого метода, определенного в заголовке. Лучше всего будет определить новый метод, скажем _private_commonInit, и не делиться этим в заголовке вашего класса.

0

Я считаю, что это на самом деле в соответствии с проектом. Полиморфизм в лучшем случае! .. сам на самом деле относится к объекту, который изначально отправил сообщение (что не всегда является экземпляром класса, в котором появляется я) ... одним из способов решения этой проблемы было бы связать commonInit таким же образом, как Init прикован ... a вызов [super commonInit] выведет правильный метод из подкласса ...

+0

Я понимаю, что это полиморфизм (если он был объявлен публично в заголовке), но визуализацию, если вы получили из класса SDK, у которого было имя вашего метода, и не имели возможности «достигнуть пика» внутри реализации. Это может вас испортить. (И во время выполнения!). Полагаю, я мог бы объединить методы, как вы предлагаете, но это может стать уродливым –

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

  • Нет связанных вопросов^_^