Vererbung - Geschwindigkeit

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Caesium

Betreff: Vererbung - Geschwindigkeit

BeitragDo, Apr 17, 2008 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
huhu,

ich habe folgende frage an euch: wo liegt der sinn eine basisklasse inklusive leerer funktionen zu erstellen?

ein beispiel, damit man sieht, was ich meine:

basisklasse:
Code: [AUSKLAPPEN]
Type Tbase Abstract
   Field field1:Int
   Field field2:Int
   Field field3:Int
   
   Function function1()   End Function
   
   Method method1()   End Method
End Type


abgeleitete klasse:
Code: [AUSKLAPPEN]
Type Texample Extends Tbase
   Method New()
      field1 = 1
      field2 = 2
      field3 = 3
   End Method

   Function function1()
      'tu irgendwas...
   End Function

   Method method1()
      'tu irgendwas...
   End Method
End Type


an folgendem beispiel sieht man denke ich ganz gut, was ich meine. in der basisklasse werden variablen deklariert die dann nach der vererbung in der abgeleiteten klasse verwendet werden (können), soweit ist mir der sinn auch noch klar. doch in der basisklasse eine funktion/methode zu deklarieren die sowieso nach der vererbung wieder überschrieben wird, da man ja nicht mit Super auf die ursprüngliche zugreift (warum auch, sie ist ja leer), erscheint mir das ganze irgendwie sinnlos.

diese "technik" ist mir in einem tutorial auf blitzbasic.com aufgefallen (bzw. aus dem dortigen forum). aber außer zur übersicht (und soviel bringt das nun auch nicht an übersichtlichkeit) ist das doch irgendwie... non-sense!? hiermit erweitere ich meine ursprüngliche frage: zieht das nicht einfach nur die geschwindigkeit runter?

vielen dank im vorraus,
caesium
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist da schon schwieriger. Smile
 

ChristianK

BeitragDo, Apr 17, 2008 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Die abstrakten Methoden im Type sind nicht leer, sondern dienen sozusagen als Vorlage. Du kannst daher auch keine Instanz eines Types erzeugen, der abstrakte Methoden enthält.
Zum Beispiel bei einem Raumschiff:

Code: [AUSKLAPPEN]
SuperStrict
Framework brl.blitz

Type TRaumschiff
   Method Fliegen( ) Abstract
   Method Tanken( ) Abstract
End Type

Type TMumu Extends TRaumschiff
   Method Fliegen( )
      WriteStdout "Mumu fliegt!"
   End Method
   
   Method Tanken( )
      WriteStdout "Mumu tankt!"
   End Method
End Type

Type TDubidu Extends TRaumschiff
   Method Fliegen( )
      WriteStdout "Dubidu fliegt!"
   End Method
   
   Method Tanken( )
      WriteStdout "Dubidu tankt!"
   End Method
End Type

Local schiff:TRaumschiff = New TDubidu
schiff.Fliegen( )
schiff.Tanken( )

Damit alle Raumschiffe über die gleichen Methoden ( Fliegen und Tanken ) verfügen, werden die Methoden des Basistypes als Abstract deklariert. Wenn jetzt ein Type von TRaumschiff abgeleitet wird, müssen alle abstrakten Methoden überschrieben werden.
Die Geschwindigkeit leidet nur unwesentlich bis garnicht darunter.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Caesium

BeitragDo, Apr 17, 2008 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
kurz und knapp, danke. Smile

gruß,
caesium

edit: @artemis: auch wenn du "zu langsam" warst war es trotzdem hilfreich den sinn der sache besser zu verstehen. danke!
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist da schon schwieriger. Smile
  • Zuletzt bearbeitet von Caesium am Do, Apr 17, 2008 19:19, insgesamt 2-mal bearbeitet

Artemis

BeitragDo, Apr 17, 2008 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du nur eine Klasse davon ableitest ist das ganze sowieso Quatsch, da man dass dann in eine Klasse packt.

Aber die Funktion einer abstrakten Klasse ist nützlich um Dinge zu verallgemeinern.
Code: [AUSKLAPPEN]
Type Fahrzeug Abstract
   
   Field geschwindigkeit:Int
   Field max_geschwindigkeit:Int
   
   Method beschleunigen() Abstract
   
   Method bremsen() Abstract
   
EndType

Type Pkw Extends Fahrzeug
   
   Method beschleunigen()
      Self.geschwindigkeit :+ 20
   EndMethod
   
   Method bremsen()
      Self.geschwindigkeit :- 20
   EndMethod
   
EndType

Type Fahrrad Extends Fahrzeug
   
   Method beschleunigen()
      If Self.geschwindigkeit < 20 Then Self.geschwindigkeit :+ 2
   EndMethod
   
   Method bremsen()
      Self.geschwindigkeit = 0
   EndMethod
   
EndType

Function BremseFahrzeug(obj:Fahrzeug)
   obj.bremsen()
EndFunction


So ist es der Funktion BremseFahrzeug egal, ob das Fahrzeug ein Fahrrad, Pkw oder ein sonstiges von der Klasse Fahrzeug abgeleitetes Objekt ist. Hauptsache ist, dass die Funktion weiß es ist ein Fahrzeug und das Fahrzeug kann man bremsen. Wie das Bremsen für die einzelnen Subklassen funktioniert müssen die selber regeln.

EDIT: Jo, da war ich wieder zu langsam.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group