2011-02-06 2 views
0

Скажем, я создаю класс, MasterClass, а затем создаю еще 4 класса, каждый подкласс MasterClass, и я хочу, чтобы каждый подкласс реализовал конкретный метод, который возвращает объект. Сам MasterClass больше класса оболочки с обычными способами полезности и т.д .. Что такое правильный формат, чтобы использовать вместо:Obj-c noob вопрос относительно подкласса с невообразимым возвращаемым типом?

// implemented by subclass 
-(MyObject*)doSomething{} 

который OBV бросает ошибку компилятора?

ТНХ

+0

Просто верните 'nil' в этом методе ... –

ответ

0

То, что вы описываете в объектно-ориентированных языках называется abstract class. Objectove-C не поддерживает абстрактные классы. Однако вы можете объявить метод в суперклассе и выполнить его реализацию за исключением. Это заставит ваши подклассы переопределить его и реализовать желаемое поведение. См. Это сообщение от StackOverflow.

0

Я не уверен, я понимаю ваш вопрос, но вот выстрел: Вы хотите определить свой интерфейс, как это:

@interface Subclass1 : MasterClass 

Тогда реализовать свой метод, как обычно. декларация:

-(MyObject*)doSomething; 

реализация:

-(MyObject*)doSomething{ 

//Stuff... 

} 
0

вот что я использую в случае явной структуры подкласса:

@class MyObject; 

@interface MONBase : NSObject 

/* required override */ 
-(MyObject *)doSomething; 

/* ... */ 

@end 

@implementation MONBase 

/* ... */ 

-(MyObject*)doSomething 
{ 
    assert(0 && "this override is required"); 
    return nil; 
} 

@end 

однако ... протоколы часто как правило, более полезным в этих и подобных случаях. следующий способ показывает один из способов достижения этого. он реализует протокол и наследует от общей базы - использовать полученные от использования в OP:

@class MyObject; 

@protocol MONProtocol 

/* required overrides: */ 
@required 
- (MyObject *)doSomething; 

/* optional overrides: */ 
@optional 

@end 

/* base, with shared implementation */ 
@interface MONBase : NSObject 
@end 

@implementation MONBase 

- (MyObject *)doSomething 
{ 
    /* 
    as long as the sig matches, you won't need to declare it in the interface -- that may be a good thing. 
    you may prefer *not* to implement this, if you favor a runtime exception 
    */ 
    assert(0 && "this MONProtocol override is required"); 
    return nil; 
} 

@end 

/* subclass of MONBase which extends by implementing MONProtocol */ 
@interface MONSub : MONBase <MONProtocol> 
{ 
    MyObject* theIvar; /* << simplest case implementation */ 
} 

@end 

@implementation MONBase 

/* ... */ 

- (MyObject *)doSomething 
{ 
    return [[theIvar retain] autorelease]; 
} 

@end 

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

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