Thanks for your insights guys... I think the separate header for the mutating methods in a category should be enough in this case.
--Graham On 16/12/2012, at 8:28 AM, Jens Alfke <j...@mooseyard.com> wrote: > > On Dec 14, 2012, at 3:25 PM, Graham Cox <graham....@bigpond.com> wrote: > >> I have an abstract base class A and a mutable subclass AM. The class A owns >> a list of subsidiary objects but only the class AM has the methods for >> adding and removing these , which is what 'mutable' means for this class. >> >> There are a series of concrete subclasses B, C, D, etc which all set up the >> subsidiary objects in various configurations when they are initialized, but >> once done, the clients of these objects have no business mutating them so >> they need to be returned as the immutable variant. > > This is a classic OOP design problem — it’s one of the things multiple > inheritance or mixins are supposed to solve. You’d make the mutability API a > mixin class that could be inherited by mutable subclasses of A, B, C, etc — > AM, BM, CM. There’s no way to do this in Obj-C, though — and in practice this > capability tends to introduce all kinds of complications in languages that > support it like C++. > >> However, in order to work during setup they are in fact subclasses of AM. > > That’s one way to do it in Obj-C. Another way is to get rid of the > distinction between A and AM and just make mutability a boolean attribute of > an instance. The mutating methods can have assertions that check this. This > is the way that the collection classes in Foundation/CF work. > >> Is there a way to return them as if they were subclasses of A, so that the >> existence of the mutating methods is hidden from the client code? >> It only needs to go as far as flagging a compile warning if the client >> attempts to use a mutating method > > I’d put the mutating methods in a category in a separate header file. That > way the code that needs to use them can #import that header and use the API, > but it’s not generally known to clients. > > —Jens > _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com