让我说我创建一个类,MasterClass,然后创建另外4个类,每个子类MasterClass,我希望每个子类实现一个返回一个对象的特定方法。 MasterClass本身更像是一个具有常用实用方法等的shell类。使用的正确格式是什么,而不是:
// implemented by subclass
-(MyObject*)doSomething{}
哪个obv会抛出编译错误?
THX
答案 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
协议很好,因为它们提供了多重继承的许多好处,并且提供的依赖性非常小。