On Tue, Oct 01, 2002 at 04:01:26PM -0700, Michael Lazzaro wrote: > > >On Tue, Oct 01, 2002 at 03:43:22PM -0400, Trey Harris wrote: > >>You want something like > >> > >> class Car is Vehicle renames(drive => accel) > >> is MP3_Player renames(drive => mp3_drive); > > I *really* like this, but would the above be better coded as: > > class Car is Vehicle renames(drive => accel) > has MP3_Player renames(drive => mp3_drive); > > .... implying a "container" relationship with automatic delegation? > Among the other considerations is that if you simply said > > class Car is Vehicle has MP3_Player; > > the inheritance chain could assume that Car.drive === Vehicle.drive, > because is-a (inheritance) beats has-a (containment or delegation). If > you needed to, you should still be able to call $mycar.MP3_Player.drive > to DWYM, too.
I don't think I like this. Assume that instead of an mp3 player my car has a 007 CD autochanger. then $car.drive is as we expect, Vehicle.drive, because inheritance beats containment or delegation. But I could get a nasty shock when I want to open the tray on the CD player, call $car.eject, and the car fires me out through the sunroof. I think that the first syntax class Car::Q is Car renames(eject => ejector_seat) is CD_Player renames(drive => cd_drive); makes it more clear that I'd like to pick and choose which methods the composite object gets from which parent. Nicholas Clark -- Even better than the real thing: http://nms-cgi.sourceforge.net/