2016-10-17 1 views
1

Ich bin ziemlich neu in Smalltalk und ich bin fest, wie Sie Elemente aus einem Stapel drucken. Ich habe zwei Klassen, eine, die den Stapel mit OrderedCollection erstellt, die funktioniert, und eine zweite Klasse (Object Subklasse). Für die zweite Klasse habe ich zwei Instanzvariablen name und weight (mit set und get Methoden). Ich muss zwei weitere Methoden print und printSpecial machen. Drucken gibt den Namen und das Gewicht für das Transcript in derselben Zeile aus, wobei die get-Methode von name verwendet wird, die get-Methode jedoch nicht vom Gewicht. PrintSpecial ist dem Drucken ähnlich, aber das Gewicht muss < 100 sein. Ich habe versucht, print und printScpecial zu drucken, kann es aber nicht herausfinden. Unten ist was ich bisher habe. Jede Hilfe wäre willkommen.Drucken von einer OrderedCollection in Smalltalk

name: a 
    name := a 

name 
    ^name 

print 
    [ Transcript 
     show: weight; 
     show: name; 
     cr ] 

printSpecial 
    [ weight <= 100 ] 
     whileTrue: [ Transcript 
      show: weight; 
      show: name; 
      cr ] 

Antwort

4

Sowohl Ihre print und printSpecial Methoden umschließen ihre Körper in eckigen Klammern. Sie sollten sie entfernen. Versuchen:

print 
    Transcript 
    show: weight; 
    show: name; 
    cr 

printSpecial 
    weight <= 100 ifTrue: [ 
    Transcript 
     show: weight; 
     show: name; 
     cr] 

Beachten Sie, dass in printSpecial I whileTrue: mit ifTrue: ersetzt habe. Der Grund ist, dass Sie nicht für immer drucken möchten, wenn die weight passiert, um die Bedingung zu erfüllen.

Eine andere Sache, die ich vorschlagen würde, ist zu vermeiden, Code zu wiederholen. Also, ich würde dies vorschlagen:

printSpecial 
    weight <= 100 ifTrue: [self print] 

diese Weise, wenn Sie später entscheiden print verbessern Sie nicht die Verbesserung printSpecial zu kopieren.

Schließlich sagen Sie, Sie haben eine Sammlung dieser Objekte. Daher sollten Sie eine Möglichkeit haben, sie zu nummerieren (z. B. über do:). Wenn also die eigentliche Anfrage darin bestand, alle zu drucken, sollten Sie print und printSpecial in der Klasse der Elemente implementieren und dann die gleichen Nachrichten in Ihrer Klasse Stack implementieren.

Stack >> print 
    collection do: [:elem | elem print] 

Stack >> printSpecial 
    collection do: [:elem | elem printSpecial] 

wo ich, dass die Instanzvariable gehe mal davon aus, dass Ihre Elemente hält collection gestattet.

Noch besser. Sie könnten do: in Ihrer Stack Klasse implementieren und dann self do: anstelle von collection do: verwenden, wie ich oben getan habe. Etwas auf den Linien von

Stack >> do: aBlock 
    collection do: aBlock 

und dann

Stack >> print 
    self do: [:elem | elem print] 

Stack >> printSpecial 
    self do: [:elem | elem printSpecial] 
+0

Danke, das hat mir sehr geholfen. – user2871898