On 20-Jan-06, at 7:11 PM, John Maclean wrote: > I'm sorry I still don't get it. (To be honest I think that I can > narrow > down this problem to the book not having all of the code in a single > place)... > > I can understand that for example (p27) is telling us that there's a > "right way" and "wrong way" to specify methods for child > instances.. so > what's wrong with this? > > #!/usr/bin/env ruby > require 'class_Song.rb' > > # test if this class has been loaded correctly > Object.const_defined?(:Song) > > class KaraokeSong < Song > # grab all the properties from the parent but add another instance > variable > def initialize(lyrics) ... shouldn't you have a call like super('','','') here to initialise the parent class variables? > @lyrics = lyrics > end > > def to_s > super + " [#@lyrics]" > end > end > > song = KaraokeSong.new("And now, the...") > #song = KaraokeSong.new("My Way", "Sinatra", 225, "And now, the...") > song.inspect > song.to_s > puts song > > The above has not specified a name, artist and duration - but that's > coming from the parent class, is it not? > > > jayeola@tp20$ ruby -w class_KaraokeSong.rb > ./class_Song.rb:12: warning: instance variable @name not initialized > ./class_Song.rb:12: warning: instance variable @artist not initialized > ./class_Song.rb:12: warning: instance variable @duration not > initialized > ./class_Song.rb:12: warning: instance variable @name not initialized > ./class_Song.rb:12: warning: instance variable @artist not initialized > ./class_Song.rb:12: warning: instance variable @duration not > initialized > Song: -- () [And now, the...] > > > > On Sat, 21 Jan 2006 07:37:03 +0900 > Eero Saynatkari <ruby-forum-reg / mailinator.com> wrote: > >> John Maclean wrote: >>> Thanks for another fast response. Inheritance - I'm going to get >>> this -tonight-! >>> >>> recap; >>> # the parent class >>> cat fx/ruby/chap3/class_Song.rb >>> #!/usr/bin/env ruby >>> class Song >>> def initialize(name, artist, duration) >>> # define instance variables >>> @name = name >>> @artist = artist >>> @duration = duration >>> end >>> >>> def to_s >>> # method for displaying these instancess >>> "Song: #@name--#@artist (#@duration)" >>> end >>> end >>> >>> # the child class >>> >>> jayeola@tp20$ cat fx/ruby/chap3/class_KaraokeSong.rb >>> #!/usr/bin/env ruby >>> require 'class_Song.rb' >>> >>> # test if this class has been loaded correctly >>> Object.const_defined?(:Song) >>> >>> class KaraokeSong < Song >>> def initialize(name, artist, duration, lyrics) >>> super(name, artist, duration) >>> @lyrics = lyrics >>> end >>> >>> def to_s >>> super + " [#@lyrics]" >>> end >>> end >>> >>> #song = KaraokeSong.new("My Way", "Sinatra", 225, "And now, the...") >>> #song = KaraokeSong.new("Sinatra", 225, "And now, the...") >>> #song.to_s >>> #song.inspect >>> >>> >>> How do we get KaraokeSong to acquire it's parent's attributes >>> -without- hadrcoding "def initialize(name, artist, duration, >>> lyrics)", unless one has to? From the book I get the impression that >>> you can get away with specifying the child's stuff and that it will >>> take properties from it's parent with the keyword super.... >> >> If the child needs additional parameters (or otherwise overrides >> the corresponding method in the parent class), you must* define >> the method in the child (super will run the parent's method like >> in your #initialize above). When the parent's behaviour is adequate, >> you do not need to define a method, it is automatically inherited. >> >> An alternative would be to just have an accessor for @lyrics; that >> way you would not need to define #initialize, but you would need to >> call #lyrics= to set the lyrics initially., which on the surface >> would seem the more cumbersome way. >> >> >> E >> >> * Not strictly true; you could circumvent this with some careful >> metaprogramming but it really is not worth it in this situation. >> > > > -- > John Maclean > MSc (DIC) > 07739 171 531 > > > -- Mike Stok <mike / stok.co.uk> http://www.stok.co.uk/~mike/ The "`Stok' disclaimers" apply.