关于使用非void返回类型进行子类化的Obj-c noob问题?

时间:2011-02-06 03:17:56

标签: iphone objective-c

让我说我创建一个类,MasterClass,然后创建另外4个类,每个子类MasterClass,我希望每个子类实现一个返回一个对象的特定方法。 MasterClass本身更像是一个具有常用实用方法等的shell类。使用的正确格式是什么,而不是:

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

哪个obv会抛出编译错误?

THX

3 个答案:

答案 0 :(得分:0)

我不确定我理解你的问题,但这里有一个镜头:你想要像这样定义你的界面:

@interface Subclass1 : MasterClass

然后像往常一样实施你的方法。 声明:

-(MyObject*)doSomething;

实现:

-(MyObject*)doSomething{

//Stuff...

}

答案 1 :(得分:0)

您在面向对象语言中描述的内容称为abstract class。 Objective-C不支持抽象类。但是,您可以在超类中声明该方法并使其实现抛出异常。这将强制您的子类覆盖它并实现所需的行为。

请参阅StackOverflow中的这篇文章。

答案 2 :(得分: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

协议很好,因为它们提供了多重继承的许多好处,并且提供的依赖性非常小。