2013-08-25 5 views
1

У меня есть суперкласс и подклассы в следующем формате:Вызова метода суперкласса от подклассов объективных C

ParentClass.h 

@interface ParentClass : NSObject 

-(ParentClass *)field:(NSArray *)fields; 
@end 

ParentClass.m 
#import "ParentClass.h" 

@implementation ParentClass 

-(id)init{ 
     self = [super init]; 
     if (self == nil) { 
     return self; 
     } 
     return self; 
} 


-(ParentClass *)field:(NSArray *)fields{ 
    ParentClass *pc = [[ParentClass alloc] init]; 
    // code  
    return pc; 

} 

@end 

Subclass.h 

@interface Subclass : ParentClass 

-(Subclass *)field:(NSArray *)fields; 

@end 



Subclass.m 
#import "Subclass.h" 

@implementation Subclass 

-(id)init{ 
    self = [super init]; 
    if (self == nil) { 
    return self; 
    } 
    return self; 
} 


-(Subclass *)field:(NSArray *)fields{ 

// code  
    return (Subclass *)[self field:fields]; 

} 
@end 

Я предполагаю, что вопрос здесь.

возвращение (подкласс *) [поле пользователя: поля];

Я не получаю доступ к методу родительского класса так, как должен. Может ли кто-нибудь сказать, что должно быть правильно?

Что делать, если я позвоню так?

- (Подкласс *) subClassField: (NSArray *) поля {

return (Subclass *)[self field:fields]; 

}

и я заменил - поле (Подкласс *): (*) NSArray полей;

с - (Подкласс *) subClassField: (NSArray *) поля;

+0

Что вы пытаетесь сделать, точнее, почему возникает вопрос. У вас в настоящее время есть бесконечный цикл и очень странная структура. Пожалуйста, объясните свою конечную цель. – Wain

+0

Мне нужно получить доступ к методам из ParentClass, чтобы получить данные и ввести их в подкласс внутри метода, объявленного в подклассе. // - (ParentClass *) field: (NSArray *) поля –

+0

Вы можете использовать только подкласс, если это фактически экземпляр подкласса. И это не говорит нам о том, чего вы на самом деле пытаетесь достичь, а просто говорит нам, что вы думаете, какой подход вы хотите предпринять ... Почему вы хотите, чтобы существующий экземпляр создавал новый экземпляр? – Wain

ответ

1

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

return (Subclass*) [super field:fields]; // Still wrong 

Но вы пролом полиморфизм, и, как говорит метод подписи , вы возвращаете объект Subclass, и пользователь, который вызывает этот метод, ожидает иметь объект Subclass, но при первом вызове метода, который только что реализован подклассом, он выходит из строя, потому что вы возвращаете экземпляр суперкласс. Может быть, вам достаточно изменить сигнатуру метода, чтобы вернуть указатель ParentClass, но это делает метод бесполезным, зачем его переопределять? Не совсем понятно, что вы пытаетесь сделать, и каков ваш логический путь.

Редактировать

Просмотрев код, который вы размещены на Github, здесь ситуация довольно разные. В коде Java метод field возвращает this, поэтому новый объект не создается и метод используется только для побочных эффектов. Метод add не нарушает полиморфизм, поскольку ссылка на объект имеет тип родительского класса, но если он выполняется в подклассе, он возвращает сам объект(), который относится к типу подкласса.

В Objective-C для этих случаев используется тип id, который используется для представления любого указателя объекта любому классу. Вы также можете использовать тип ParentClass, но я буду придерживаться условностей. Вот примерный код:

@implementation ParentClass 

@synthesize endpoint 

- (id) add: (NSString*) endpoint fields: (NSArray*) fields 
{ 
    <code> 
    return self; 
} 

- (id) field: (NSArray*) fields 
{ 
    return [self add: self.endpoint fields: fields]; 
} 

@end 

@implementation SubClass 

- (id) field: (NSArray*) fields 
{ 
    < Additional code > 
    return [self add: self.endpoint fields: fields]; 
} 


@end 
+0

Я внес некоторые изменения. Это помогает? Я не переопределяю его, а просто делаю тип –

+0

@SiddharthanAsokan. Теперь, когда вы не переопределяете этот метод, вам все равно придется возвращать реальный объект Subclass, и если вы вернете [super field: fields] из subClassField:, это будет все еще неправильно. –

+0

https://github.com/Semantics3/semantics3-java/tree/master/src/com/semantics3/api Я пытаюсь создать объективный код C, похожий на версию java здесь. Semantics3Request является родительским классом, а другие классы являются подклассами. Удивление, если это способ достичь этой логики на цели. –

2

Сначала обратите внимание, что этот код

-(ParentClass *)field:(NSArray *)fields{ 
    ParentClass *pc = [[ParentClass alloc] init]; 
    // code  
    return pc;  
} 

Не смотрите прямо из дизайна программного обеспечения точки зрения. Из того, что вы разместили, кажется, что экземпляры ParentClass могут создавать и возвращать другие экземпляры своего типа из метода поля. Это не выглядит нормально, но это может быть хорошо в зависимости от ваших намерений.

Рассмотрите возможность принятия ParentClass и FieldClass различных классов, если это имеет смысл.


Что касается подкласса, то способ делать то, что вы хотите, это было бы:

-(ParentClass *)field:(NSArray *)fields 
{ 
    // code  
    return [super field:fields]; 
} 

Обратите внимание, что я изменил возвращаемый тип будет (ParentClass *) и self к super. Вы не можете вернуть объект ParentClass вместо объекта SubClass (последний может иметь дополнительные данные, о которых бывший не знает). Выполнение противоположного действия действительно (вы можете вернуть объект Subclass, когда кто-то ожидает получить объект типа ParentClass).

+0

Я внесла некоторые изменения. Это помогает? Я не переопределяю его, а просто делаю приведение. –

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

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