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