Ah, it looks like I'm in good company :)

Thanks for the references!

-Andy

-----Original Message-----
From: Andy Lee [mailto:ag...@mac.com] 
Sent: Wednesday, February 25, 2009 9:16 AM
To: Andy Klepack
Cc: Cocoa-dev@lists.apple.com
Subject: Re: Subclassing with more restrictive initializers

This is a variation of the Square-Circle problem, aka Circle-Ellipse:

<http://www.google.com/search?q=square+rectangle+inheritance>
<http://www.google.com/search?q=circle+ellipse+inheritance>
<http://en.wikipedia.org/wiki/Circle-ellipse_problem>

You have a class that conceptually is a refinement of another class,  
which typically suggests a class-superclass relationship.  The problem  
is that the subclass would have to disallow some behavior that is  
promised by the contract of the superclass.  For example, in human- 
speak, a Square "is a" Rectangle, but in OO-speak, you could  
reasonably have a method -[Rectangle initWithWidth:height:] but it  
wouldn't make sense for Square.  To use your example, a PreferenceFile  
"is a" File, but it wouldn't make sense for it to respond to - 
initWithPath:.

The Wikipedia article linked above lists some approaches to the  
problem.  One approach that comes to mind -- use a class cluster -- is  
a variation of the "Limit the interfaces" option.

--Andy


On Feb 25, 2009, at 11:39 AM, Andy Klepack wrote:

> I've run up against this situation more than once and I'd be  
> interested in any opinions and best-practices out there.
>
> I have a class that has one or more initializers that accept  
> parameters. The class also has behavior.
>
> I want to implement a second class that has the behavior of the  
> first in addition to its own behavior. This class should also have  
> more restrictive initializers. That is, the second class should not  
> allow the kind of parameterization that the first class does.
>
> On the one hand this feel a like inheritance: the second class  
> really is-a kind of the first class. But those pesky initializers  
> (from the first class) don't make sense for the subclass.
>
> On the other hand, this looks kinda like trying to create an  
> instance through sub-classing (and that would be wrong) except that  
> behavior is being added as well.
>
> On the other-other hand this feel like it could be composition  
> (instances of the second class have-a member of the first class),  
> but the behavior of the first class would have to be accessed  
> through a wrapper provided by the second class.
>
> To make things more concrete (this isn't the actual case I've run  
> into, but it's a similar, simpler illustration) consider a class  
> "File" that has an initializer 'initWithPath:' and behavior  
> 'delete', 'rename', etc. Then consider wanting to implement a class  
> like 'PreferenceFile' that should only refer to files in the  
> Preferences directory and thus has an 'initWithName:" initializer.  
> "initWithPath" provides too much parameterization since it could  
> refer to any file outside of the Preferences directory. Finally, the  
> PreferenceFile class should have the same behavior as File and add  
> some of its own (e.g. "setPrefValue:ForKey:").
>
> Should PreferenceFile inherit from File despite the initialize  
> behavior being undesirable? Is composition somehow more appropriate?  
> Is this confusion the result of thinking about the problem from the  
> wrong direction?
>
> Any advice about how to think about and approach this sort of design  
> problem would be great.
>
> -Andy


aglee




_______________________________________________

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to