German B4X: Vererbung -> 'Composition'

Kiffi

Well-Known Member
Licensed User
Longtime User
Hallo,

ich habe folgendes Konstrukt, welches ich in B4X - Syntax übersetzen möchte:
B4X:
Class Tier
    Property AnzahlBeine As Integer
End Class

Class Kuh
    Inherits Tier
    Sub GibLaut()
        Console.WriteLine("Muh!")
    End Sub
End Class

Module Module1
    Sub Main()
        Dim MeineKuh = New Kuh
        MeineKuh.AnzahlBeine = 4
        MeineKuh.GibLaut()
    End Sub
End Module

Nun unterstützt B4X leider keine Vererbung von Klassen. In anderen Threads empfiehlt Erel, 'Composition' hierfür zu verwenden. Allerdings finde ich kein gescheites Beispiel zum Thema 'Composition'.

Wer kann mich in die richtige Richtung schubsen?

Danke im Voraus & Grüße ... Peter
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Hallo Alexander,

vielen Dank für Deine schnelle Antwort!
Klicke mal auf "Project" und dann drücke "Add New Module" und wähle "class module" das sollte deine Frage beantworten.

nee, leider nicht. Wie ich Klassen erstelle und sie nutze, weiß ich. Mir geht es um diese 'Composition', die lt. Erel eine Alternative zur Vererbung sein soll:
Inheritance is not supported. You can however use composition (which in most cases results in a better design). Add FirstClass as an instance of SecondClass.

Sähe das dann so aus?

Tier.bas:
B4X:
'Class module
Sub Class_Globals
    Dim AnzahlBeine As Int
End Sub


Kuh.bas:
B4X:
'Class module
Sub Class_Globals
    Dim Tier As Tier
End Sub

Public Sub GibLaut
    Log("Muh")
End Sub

Main:
B4X:
Sub AppStart (Args() As String)
  
    Dim MeineKuh As Kuh
    MeineKuh.Tier.AnzahlBeine = 4
    MeineKuh.GibLaut()
  
End Sub

Das wäre aber eine ziemlich hässliche Syntax...

Grüße ... Peter
 
D

Deleted member 103

Guest
Das wäre aber eine ziemlich hässliche Syntax...
Vieleicht sieht es so besser.
Main:
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Private Meinetiere  As Tier
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")

    Meinetiere.Initialize
   
    Meinetiere.AnzahlBeine = 4

    Meinetiere.kuh.GibLaut
End Sub

Tier:
B4X:
Sub Class_Globals
    Private Beine As Int
    Public kuh As Kuehe
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
    kuh.Initialize
End Sub

Public Sub setAnzahlBeine( Value As Int)
    Beine = Value
End Sub

Public Sub getAnzahlBeine As Int
    Return Beine
End Sub

Kuehe:
B4X:
Sub Class_Globals

End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize

End Sub

Public Sub GibLaut()
    ToastMessageShow("Muh!", True)
End Sub
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Hallo Filippo,

Vieleicht sieht es so besser.

interessanter Ansatz, aber leider nicht das, was ich suche:
B4X:
Dim MeineKuh As Kuh
MeineKuh.AnzahlBeine = 4
MeineKuh.GibLaut()

anstelle von:
B4X:
Dim MeineKuh As Kuh
MeineKuh.Tier.AnzahlBeine = 4
MeineKuh.GibLaut()

(das mag jetzt auf den ersten Blick ein wenig haarspalterisch zu sein, aber ich verfolge damit einen speziellen Zweck (und nein: ich möchte kein FarmVille nachprogrammieren. ;)))

Dennoch Danke für Deine Mühe! Ich sehe das mal als 'Unschönheit' in der B4X-Syntax und versuche, mich damit zu arrangieren.

Grüße ... Peter
 
D

Deleted member 103

Guest
Dennoch Danke für Deine Mühe! Ich sehe das mal als 'Unschönheit' in der B4X-Syntax und versuche, mich damit zu arrangieren.
Man kann leider nicht alles haben. ;)
 

corwin42

Expert
Licensed User
Longtime User
@Kiffi Deine Lösung ist denke ich die sauberste und das, was Erel gemeint hat.

Mit etwas Aufwand könnte man halt in der Kuh-Klasse Setter und Getter für Anzahl Beine implementieren:
B4X:
Sub setAnzahlBeine(Beine As Int)
    Tier.AnzahlBeine = Beine
End Sub

Sub getAnzahlBeine As Int
    return Tier.AnzahlBeine
End Sub

Damit versteckst Du dann zwar die Tier-Klasse wieder und hättest die Syntax wie bei der Vererbung. Allerdings musst Du das dann für alle Subklassen machen, wie z.B. Hund und Katze auch. Das produziert also redundanten Code.

Vorteil bei der Composition ist halt, dass Du sofort siehst, aus welche Klasse eine bestimmte Funktion kommt. Macht meiner Meinung nach den Code übersichtlicher als bei der Vererbung.
 
Top