IWETHEY v. 0.3.0 | TODO
1,095 registered users | 0 active users | 0 LpH | Statistics
Login | Create New User
IWETHEY Banner

Welcome to IWETHEY!

New IS A vs HAS A
One key question I always ask when designing classes and figuring out inheritance is "Is the child object an IS A relationship to the parent?" Most of the time, the answer is no.

I have a guy at work right now that wants to inherit everything from a generic logging class called ILOG. I've been trying to explain that server objects HAVE logging, but they aren't logging. He doesn't agree.

But the IS A/HAS A question, I think, is a good way to figure out if you need to inherit or not.

Basic OO 101.

Glen Austin
Expand Edited by gdaustin Aug. 4, 2003, 10:30:10 PM EDT
New Quite.
While working with an incomplete object API with implementation mistakes, we often have to decide when adding a new class if we're doing an IS A or a HAS A interface. The distinction is most useful.

Wade.

Is it enough to love
Is it enough to breathe
Somebody rip my heart out
And leave me here to bleed
 
Is it enough to die
Somebody save my life
I'd rather be Anything but Ordinary
Please

-- "Anything but Ordinary" by Avril Lavigne.

New I missed that course
Basic OO 101.
No, literally ... I haven't taken any programming courses since Turbo Pascal in '81. So while I've picked up most of the techniques I don't know the terminology. When you say "IS A/HAS A" ... what's that mean? I think I get it, but I'm not sure.
===

Implicitly condoning stupidity since 2001.
New Shorthand for relationships
Circle IS A(n) Shape - any place you can use a shape, you can use a circle

Database HAS A Connection - a database isn't a connection, but it uses one
Regards,

-scott anderson

"Welcome to Rivendell, Mr. Anderson..."
New Re: Shorthand for relationships
Translate into message passing parlance?
-drl
New snicker
"HAS A": an object passes messages to another object.

"IS A": an object is silent. It already is the other object.


I'm gonna go build my own theme park! With Blackjack! And hookers! In fact, forget the park!
New ISA/HASA are good for a first approximation
but don't always tell the whole story. ISA in particular carries meanings from the real world that don't always translate well in the software world. For example: a square ISA rectangle, but inheriting a square from a rectangle might not be a good idea (there is a square/rectangle debate that regularly breaks out on comp.object every six months).

Furthermore, we use ISA in different ways. My car ISA Saturn, and a Saturn ISA car. The first ISA relates a individual car to a class of cars. The second ISA relates a class of cars to a larger class of cars. The latter is an inheritance relationship, and the former is a instantiation relationship.

All I'm saying is that ISA/HASA is a good first cut, but don't get hung up them when you get down to nitty-gritties.
--
-- Jim Weirich jweirich@one.net [link|http://onestepback.org|http://onestepback.org]
---------------------------------------------------------------------
"Beware of bugs in the above code; I have only proved it correct,
not tried it." -- Donald Knuth (in a memo to Peter van Emde Boas)
New So what does it get you?
This came up in an "Extends vs Implements" debate. As I'm not a Java programmer, I'm not sure what this implies. Are they actually different constructs or just different ways of conceptualizing the process?
===

Implicitly condoning stupidity since 2001.
New Specialization vs. Generalization
A Saturn IS A Car is a specialization relationship, meaning that a Saturn is a special kind of car.

If you start with a car base class, assuming you had functions like honk, turn left, turn right, stop, accelerate, etc. Then you could create a Saturn, but use it as a car. You could create any kind of car. Kind of like when you're at the car rental agency. Any car will do, as long as it holds you.

However, if you require detail at the specialization level, then you may want to know specific details of the car, like where the transmission dipstick is, or how many RPMs or horsepower a Saturn has (not many).

I don't see much of "A Car IS A Saturn", except in broken inheritance. At this point, you're trying to hide the details the base class, in an inherited class. This is usually a bad idea. The problem there is that you still have to implement the base class function, but then you have to make it do nothing. At the point you do this, you drive the people using your classes nuts. ("What! This used to work!)

You want the more general classes higher in the heirarchy, and the more specific down lower.

My 2 cents.

Glen
New Code
# Code showing my_car ISA Saturn ISA Car\n\nclass Car; end\n\n# A Saturn ISA Car \n# (Specialization or Inheritance ... a Class named Saturn\n# inherits from the class named Car)\n\nclass Saturn < Car; end\n\n# My car ISA Saturn \n# (Instantiation ... An instance of a Saturn class is created\n# and bound to the name "my_car")\n\nmy_car = Saturn.new

--
-- Jim Weirich jweirich@one.net [link|http://onestepback.org|http://onestepback.org]
---------------------------------------------------------------------
"Beware of bugs in the above code; I have only proved it correct,
not tried it." -- Donald Knuth (in a memo to Peter van Emde Boas)
New Thanks, but what would HASA look like?
===

Implicitly condoning stupidity since 2001.
New HASA
class Server
{

LoggingClass myLog;
};


Server myServer;

myServer.myLog.Log( LoggingClass::LOG_DEBUG, "Writing to the Log" );

The End.
New See, that's where I always get tripped up
People have such heated debates about differences between things (ISA/HASA in this case) and pros/cons thereof that I assume there must be more to it than it sounds like; that I must be missing something because I never took the classes where they taught the terminology.

These two examples show different ways of doing something. It seems clear (to me) that they would work differently, and each is appropriate in its own way. I don't understand how anyone could say that one is "right" and one is "wrong". It depends on what you're trying to do.

Actually this feels like something someone wrote in here a little while ago: (Can't find the link.) It seems so obvious It didn't occur to me anyone would have bothered to name it.
===

Implicitly condoning stupidity since 2001.
New There is a point to naming the useless stuff
Two points in fact.

The first is that if you don't name it, then you have to explain it every time the difference matters. (That or else get tripped up because you meant one thing and someone heard the other.)

The second is that some people think it impressive to know a lot of made-up words.

Sometimes it is hard to tell where the difference is between words that exist for the first and the second reasons. However I have encountered enough people with serious confusion about when they might want to have is-a vs has-a that I consider having phrases that distinguish that to have real value in technical communication.

Cheers,
Ben
"good ideas and bad code build communities, the other three combinations do not"
- [link|http://archives.real-time.com/pipermail/cocoon-devel/2000-October/003023.html|Stefano Mazzocchi]
New Clarification
I wasn't suggesting that ISA/HASA are the same thing. Quite the opposite: I think they are so fundamentally different that I don't understand having this distinction. It seems to me like having a special term to define the difference between variables and pancakes. They're just different things.

Okay, I'm exaggerating. But are there people who know both of these methods that need it pointed out that they're different?
===

Implicitly condoning stupidity since 2001.
New Yes
More specifically, I have seen people propose designs where people reach for is-a in lots of places where they really needed to reach for has-a. You can virtually see the lightbulb go off when you explain the difference and explain why they really need the other.

The biggest contributing cause that I see for this are people who think that inheritance is good because it is OO and therefore they should use inheritance. But inheritance traditionally is an is-a relationship - that isn't the right hammer when you have a has-a relationship to model.

Cheers,
Ben
"good ideas and bad code build communities, the other three combinations do not"
- [link|http://archives.real-time.com/pipermail/cocoon-devel/2000-October/003023.html|Stefano Mazzocchi]
New That's why I shouldn't be a teacher
There are some things that just seem so clear to me I don't even understand the question. It's like, "What part are you missing?"
===

Implicitly condoning stupidity since 2001.
New The example of a stack (see post above) is a good one
As to when to not use inheritance. A stack while you may think of it as a specialization of a List (Vector in Java) it is a bad candidate for inheritance because it actually offers a much smaller set of functionality then a regular list. Therefore, if stack inherits from Vector everything that Vector offers (including removing an arbitrary elemen and deleting an arbitrary element) is now part of the public interface of your stack and can be called.

Inheritance is best used when you the descendent class is the parent plus. For example, a SortedCollection extends OrderedCollection in Smalltalk.
New My car is a Saturn
Is actually not an inheritance relationship.

It is an instantiation of a specific class (Saturn) of a base class (car).

So My car is a Saturn isn't inheritance.

Unless you want to create a newspecialized Saturn car class, with new properties/functions like (This was MY CAR ( A Saturn )):

WornCarpets
FoodPasteOnBackseat
RadiatorLeak()
CrackWinshield()
etc.

;-)
Glen Austin
New hierarchies and the real world
but don't always tell the whole story. ISA in particular carries meanings from the real world that don't always translate well in the software world.

Indeed. The real world is not tree-shaped for the most part when you get right down to it. Hierarchies may be a convenient mental model for analysis (for some people), but if you base your software model on it you will often be bitten in the long run. The bottom line is that almost nothing I can identify in the real business world is truly hierarchical in the longer run.

The biggest problem (but not the only) is that tree leafs assume mutual exclusiveness of some properties. If you subclass vehicles into cars and boats, you assume that something cannot be BOTH a car and a boat. But when marketing comes out with one you are hosed and have a lot of reshuffling of your methods and attributes that risk breaking existing code. Same with "data structures". If you use a class that is a "stack", you may later want to inspect or use the same data in non-stack ways. If you follow this to its logical conclusion, then you will end up pushing all possible data structure operations to the top of the hierarchy, and end up re-inventing a (non-relational) database. Using trees to manage or limit what attributes and behavior a thing can get is a dead-end.
________________
oop.ismad.com
New Nonsense
The bottom line is that almost nothing I can identify in the real business world is truly hierarchical in the longer run.
Maybe you can't find them because you're blind. Let's see, the whole of the web is a Tree. The html that you are perusing is a Tree. The threads that you are responding to are a Tree. One need look no further than to the very concept of a Document to find them. Indeed, the Real World is chalk full of Trees.

What you actually mean to say is that (a). you don't think Types can be structured on a hierarchical basis - which is totally different to a rant that says that trees don't exist; and (b). you think a Relational Model more closely resembles the real world - not noting that relational design is a hard process that is fraught with many complexities.

If you subclass vehicles into cars and boats, you assume that something cannot be BOTH a car and a boat.
That's just a diamond shape of inheritance which is addressed by multiple inheritance. You don't give any cause to believe that an imperative scheme broken down along procedural boundaries is any more adept at sharing code betwixt the car data structures and boat data structures. You now have a car, a boat and a car-boat data structure or you have a massive data structure that handles every variation that you possibly throw at it.

Just because the methods get wrapped up in the object, this does not make it any more susceptible to problems of combining data structures. The only difference between what you propose and OO is that you don't encapsulate the methods within the data structures. Which means all your procedures have to cope with all the variations.
New Not quite that simple
But it depends on the language.

For instance, C++ has private inheritance. This means "is implemented in terms of". For your logging thing privately inheriting loggability into stuff might make sense. Especially since your methods want access to the logging but you don't want clients playing with it.

In a dynamic language - inheritance is primarily used to share code - not so much for isa type stuff. Of course here delegation is simpler to implement. The rigidity of interfaces doesn't really exist - you need only implement as much interface as your client requires. Plus, its trivial to put an object in between and forward the messages to different objects. ie you can do something like

doesNotUnderstand: aMessage

delegates do: [:each | (each respondsTo: aMessage selector) ifTrue: [each perform: aMessage selector withArguments: aMessage arguments]]

and to be complete

respondsTo: aSelector

delegates do: [:each | (each respondsTo: aSelector) ifTrue: [^true]].
^false

This gives you the functional equivalent of multiple inheritance using delegation.

I do notice that I use inheritance much less in the dynamic languages than in the static ones. Inheritance is practically the only tool you have in java. Delegation is a pain to implement if the interface is very large at all because you have to write the forwarding messages all yourself.




Smalltalk is dangerous. It is a drug. My advice to you would be don't try it; it could ruin your life. Once you take the time to learn it (to REALLY learn it) you will see that there is nothing out there (yet) to touch it. Of course, like all drugs, how dangerous it is depends on your character. It may be that once you've got to this stage you'll find it difficult (if not impossible) to "go back" to other languages and, if you are forced to, you might become an embittered character constantly muttering ascerbic comments under your breath. Who knows, you may even have to quit the software industry altogether because nothing else lives up to your new expectations.
--AndyBower
Expand Edited by tuberculosis Aug. 21, 2007, 06:36:01 AM EDT
New Thing I love/hate about smalltalk
doesNotUnderstand: aMessage

delegates do: [:each | (each respondsTo: aMessage selector) ifTrue: [each perform: aMessage selector withArguments: aMessage arguments]]

and to be complete

respondsTo: aSelector

delegates do: [:each | (each respondsTo: aSelector) ifTrue: [^true]].
^false

I can never tell if it's pseudo-code or the real thing.
===

Implicitly condoning stupidity since 2001.
New Similar to Python in that fashion
Regards,

-scott anderson

"Welcome to Rivendell, Mr. Anderson..."
New Its real



Smalltalk is dangerous. It is a drug. My advice to you would be don't try it; it could ruin your life. Once you take the time to learn it (to REALLY learn it) you will see that there is nothing out there (yet) to touch it. Of course, like all drugs, how dangerous it is depends on your character. It may be that once you've got to this stage you'll find it difficult (if not impossible) to "go back" to other languages and, if you are forced to, you might become an embittered character constantly muttering ascerbic comments under your breath. Who knows, you may even have to quit the software industry altogether because nothing else lives up to your new expectations.
--AndyBower
Expand Edited by tuberculosis Aug. 21, 2007, 06:36:13 AM EDT
New Forgot to mention: key driver is "substitutability"
isa implies I can provide one of these when it wants one of those.

ie - if the client expects a car - I can give it a Saturn, or a Chevy (a Ford wouldn't quite do I think :-P )



Smalltalk is dangerous. It is a drug. My advice to you would be don't try it; it could ruin your life. Once you take the time to learn it (to REALLY learn it) you will see that there is nothing out there (yet) to touch it. Of course, like all drugs, how dangerous it is depends on your character. It may be that once you've got to this stage you'll find it difficult (if not impossible) to "go back" to other languages and, if you are forced to, you might become an embittered character constantly muttering ascerbic comments under your breath. Who knows, you may even have to quit the software industry altogether because nothing else lives up to your new expectations.
--AndyBower
Expand Edited by tuberculosis Aug. 21, 2007, 06:36:18 AM EDT
New Techies at Hertz
"I know you wanted a Cadillac, but polymorphism dictates that a Chevy Sprint is perfectly substitutable for one."
________________
oop.ismad.com
New And if your Table or Data Structure is...
...not capable of handling a Cadillac, you're also out of luck.
New Mostly
"I know you wanted a Cadillac, but polymorphism dictates that a Chevy Sprint is perfectly substitutable for one."


Sure, unless the client relies on openNorthStarNavigation - then things will go south fast.
Of course, if the client does not rely on that feature, then the substitution is fine.



Smalltalk is dangerous. It is a drug. My advice to you would be don't try it; it could ruin your life. Once you take the time to learn it (to REALLY learn it) you will see that there is nothing out there (yet) to touch it. Of course, like all drugs, how dangerous it is depends on your character. It may be that once you've got to this stage you'll find it difficult (if not impossible) to "go back" to other languages and, if you are forced to, you might become an embittered character constantly muttering ascerbic comments under your breath. Who knows, you may even have to quit the software industry altogether because nothing else lives up to your new expectations.
--AndyBower
Expand Edited by tuberculosis Aug. 21, 2007, 12:45:06 PM EDT
New Or perhaps that ....
MaxCarCapacity which returns 4 (maybe) for the Sprint and 6 for the Cadillac.

Ask the party of 6 driving 2 hours from Tulsa to Bentonville which object they want...

New Code sharing vs. polymorphism
In a dynamic language - inheritance is primarily used to share code - not so much for isa type stuff. Of course here delegation is simpler to implement. The rigidity of interfaces doesn't really exist - you need only implement as much interface as your client requires...I do notice that I use inheritance much less in the dynamic languages than in the static ones. Inheritance is practically the only tool you have in java. Delegation is a pain to implement if the interface is very large at all because you have to write the forwarding messages all yourself.

I think you hit the nail on the head here. Inheritance should be about code sharing, but in a static language it's also how polymorphism is implemented. That overloading of inheritance makes it more difficult to for a beginner to design classes properly. I think the trick in Java is to stick with interfaces for polymorphism and use inheritance only for code sharing.

Plus, its trivial to put an object in between and forward the messages to different objects. ie you can do something like...

It's interesting how the next big thing in Java is AOP while along you could do the same thing in Smalltalk with "doesNotUnderstand".

Regards,
John
     Why extends is evil? - (johnu) - (44)
         Is this just for Java? - (drewk)
         This argument is needlessly pedantic, IMO - (FuManChu)
         Lesson learned from Smalltalk - (ChrisR) - (1)
             sounds like a will -NT - (deSitter)
         Inheritance is a tool. - (admin) - (7)
             Re: Inheritance is a tool. - (deSitter) - (3)
                 There's more to life than implementation inheritance. - (admin)
                 Definitions - (johnu) - (1)
                     I'd ask Alan Kay - (tuberculosis)
             Thank you, Scott! - (jb4) - (1)
                 Another Me Too - (JimWeirich)
             Good example of bad inheritance, java.util.Stack - (bluke)
         This guy cracks me up - (tuberculosis)
         IS A vs HAS A - (gdaustin) - (30)
             Quite. - (static)
             I missed that course - (drewk) - (18)
                 Shorthand for relationships - (admin) - (17)
                     Re: Shorthand for relationships - (deSitter) - (1)
                         snicker - (FuManChu)
                     ISA/HASA are good for a first approximation - (JimWeirich) - (14)
                         So what does it get you? - (drewk) - (10)
                             Specialization vs. Generalization - (gdaustin)
                             Code - (JimWeirich) - (7)
                                 Thanks, but what would HASA look like? -NT - (drewk) - (6)
                                     HASA - (gdaustin) - (5)
                                         See, that's where I always get tripped up - (drewk) - (4)
                                             There is a point to naming the useless stuff - (ben_tilly) - (3)
                                                 Clarification - (drewk) - (2)
                                                     Yes - (ben_tilly) - (1)
                                                         That's why I shouldn't be a teacher - (drewk)
                             The example of a stack (see post above) is a good one - (bluke)
                         My car is a Saturn - (gdaustin)
                         hierarchies and the real world - (tablizer) - (1)
                             Nonsense - (ChrisR)
             Not quite that simple - (tuberculosis) - (9)
                 Thing I love/hate about smalltalk - (drewk) - (2)
                     Similar to Python in that fashion -NT - (admin)
                     Its real -NT - (tuberculosis)
                 Forgot to mention: key driver is "substitutability" - (tuberculosis) - (4)
                     Techies at Hertz - (tablizer) - (3)
                         And if your Table or Data Structure is... - (ChrisR)
                         Mostly - (tuberculosis) - (1)
                             Or perhaps that .... - (gdaustin)
                 Code sharing vs. polymorphism - (johnu)

It requests to the errors of the tree of the activator of the exit in tribune of the suggestions.
126 ms