Le 18 juin 2010 à 17:05, Jonny Taylor a écrit :
> Thanks for your reply Jean-Daniel.
>
>>> I can see two ways of working around this - either implement placeholder
>>> methods in the base class (that raise an exception or something) in order
>>> to make the base class conform to the protocol (knowing that in practice
>>> they should always be overridden by a subclass), or have the subclass pass
>>> its "self" pointer to the base class in the form of an id<MyProtocol> that
>>> the base class uses when it needs to call such methods. Both of these leave
>>> me feeling pretty dirty, though.
>> Adding stub methods that raise an exception seam a good way to solve the
>> problem (that what all class cluster abstract class do in Cocoa Framework).
>
> The reason I wasn't wild on this is that it stops me getting compile-time
> warnings saying that the protocol is not fully implemented (since the base
> class fully implements it). There will be run-time errors when the
> non-overridden base class stub is hit. Maybe that's the best of the available
> choices, though. I just hoped there would be a "proper" way around this. I'm
> sure the language designers are far smarter than me and had good reasons for
> what they did, but I do miss abstract base classes!
Yes you will get error at runtime instead at compile time. That the main
difference between a strongly typed, static language (c++), and a language that
support dynamic typing and binding.
That's the proper Obj-C way, In Obj-C there is a lots of implicit contracts
that could not be enforced by the compiler due to the dynamic nature of the
language.
For example, it's perfectly legal in obj-c to declare a method without
implementation as the implementation can be loaded at runtime or dynamically
generated.
Note that an other way to get ride of the compiler warnings is to create a
extension interface (without implementation):
in MyBaseClass.h:
@interface MyBaseClass : NSObject {
}
@end
@interface MyBaseClass (MyProtocol) <MyProtocol>
@end
in MyBaseClass.m
@implementation MyBaseClass
// implements only a subset of the protocol
@end
But here again you will get runtime errors and no warning if a subclass does
not override the missing methods (or call super implementation).
-- Jean-Daniel
_______________________________________________
Cocoa-dev mailing list ([email protected])
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]