Ming, Inheritance, initialize, was mach ich falsch?

17/02/2009 - 00:13 von Joachim Pense | Report spam
Eine Anfàngerfrage, bei der ich nicht weiterkomme. Warum liefert new beim
zweiten Mal einen Fehler? Kann die Bibliotheksklasse SWFShape irgendwie das
Bilden von Unterklassen kontrollieren?

Hier mein reduziertest Beispielprogramm:
=#!/usr/bin/ruby

require 'ming/ming'
include Ming # Library zum Erzeugen von Flash-Animationen

class Yyy # Leere Parent-Klasse als Demo
end

class Xxx < Yyy # Unterklasse
def initialize(a=0) # Initialisierung mit einem Parameter
@a=a
end
end

x=Xxx.new(1) # eine Instanz làsst sich wie erwartet anlegen

shape0 = SWFShape.new # Die Klasse SWFShape kommt aus Ming

class MyShape < SWFShape # Davon eine Unterklasse
def initialize(a=0) # auch wieder mit einem Parameter
@a=a
end
end

shape1 = MyShape.new(5) # und das liefert einen Fehler
==
Die Fehlermeldung:
$ ruby test3.rb
test3.rb:25:in `new': wrong number of arguments (1 for 0) (ArgumentError)
from test3.rb:25

==An die Definition von SWFShape komme ich nicht ran, in
der /usr/lib/ruby/site_ruby/1.8-Hierarchie finde ich sie nicht. Vermutlich
steckt sie binàr in /usr/lib/ruby/site_ruby/1.8/i586-linux/ming/mingc.so.

Oder hab ich einfach irgendwo einen Tippfehler?

Joachim
 

Lesen sie die antworten

#1 Robert Klemme
17/02/2009 - 08:25 | Warnen spam
On 17.02.2009 00:13, Joachim Pense wrote:
Eine Anfàngerfrage, bei der ich nicht weiterkomme. Warum liefert new beim
zweiten Mal einen Fehler? Kann die Bibliotheksklasse SWFShape irgendwie das
Bilden von Unterklassen kontrollieren?

Hier mein reduziertest Beispielprogramm:
=> #!/usr/bin/ruby

require 'ming/ming'
include Ming # Library zum Erzeugen von Flash-Animationen

class Yyy # Leere Parent-Klasse als Demo
end

class Xxx < Yyy # Unterklasse
def initialize(a=0) # Initialisierung mit einem Parameter
@a=a
end
end

x=Xxx.new(1) # eine Instanz làsst sich wie erwartet anlegen

shape0 = SWFShape.new # Die Klasse SWFShape kommt aus Ming

class MyShape < SWFShape # Davon eine Unterklasse
def initialize(a=0) # auch wieder mit einem Parameter
@a=a
end
end

shape1 = MyShape.new(5) # und das liefert einen Fehler
==>
Die Fehlermeldung:
$ ruby test3.rb
test3.rb:25:in `new': wrong number of arguments (1 for 0) (ArgumentError)
from test3.rb:25

==> An die Definition von SWFShape komme ich nicht ran, in
der /usr/lib/ruby/site_ruby/1.8-Hierarchie finde ich sie nicht. Vermutlich
steckt sie binàr in /usr/lib/ruby/site_ruby/1.8/i586-linux/ming/mingc.so.

Oder hab ich einfach irgendwo einen Tippfehler?



Nein, Du hast vergessen, #initialize der Oberklasse korrekt aufzurufen.
Da du es nicht explizit machst, ruft Ruby ihn implizit als super()
auf. Aber der Konstruktor der Oberklasse braucht ein Argument. Du
kannst entweder

1. auf eine eigene Methode #initialize in der Unterklasse verzichten
(wenn du da z.B. nichts zu initialisieren hast) oder

2. musst den Aufruf explizit machen

def initialize(a=0) # auch wieder mit einem Parameter
super(a)
@a=a # wahrscheinlich überflüssig
end

Ciao

robert

remember.guy do |as, often| as.you_can - without end

Ähnliche fragen