I have created a protocol that my classes need to implement, and then factored out some common functionality into a base class, so I did this:
@protocol MyProtocol
- (void) foo;
- (void) bar;
@end
@interface Base <MyProtocol>
@end
@interface Derived_1 : Base
@end
@interface Derived_2 : Base
@end
@implementation Base
- (void) foo{
//something foo
}
@end
@implementation Derived_1
- (void) bar{
//something bar 1
}
@end
@implementation Derived_2
- (void) bar{
//something bar 2
}
@end
In this way in my code I use a generic id<MyProtocol>.
The code works (as long as Base is not used directly) but the compiler chokes at the end of the implementation of Base with a warning:
Incomplete implementation of class Base
Is there a way to avoid this warning or, even better, a more proper way to obtain this partially implemented abstract base class behavior in Objc?
You could conceivably do something like this:
@implementation Base
- (void)bar
{
if ([self class] == [Base class]) {
[self doesNotRecognizeSelector:_cmd];
}
}
@end
That way, you have an implementation, but by default it raises an exception. However, if a derived class accidentally calls [super bar]
or does not override bar
, then the exception won't be raised. If that's not what you want, you could just shorten it to:
@implementation Base
- (void)bar
{
[self doesNotRecognizeSelector:_cmd];
}
@end
In which case, an exception will be raised, even if a subclass calls [super bar]
or does not override bar
.
In your protocol definition, you need to declare your methods under the @optional
keyword.
Your code should look like this:
@protocol MyProtocol
@optional
- (void) foo;
- (void) bar;
@end
See this question on SO.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With