Open Source im professionellen Einsatz
Linux-Magazin 11/2015
611

Privat

Listing 3 demonstriert die Klassendefinition der Klasse »Sphere« . Sie verwendet in Zeile 1 die Klasse »Shapes« als Vorlage. Zeile 2 definiert die Instanzvariable »radius« . In Zeile 3 ließe sich analog eine Klassenvariable definieren. Die Klassenmethoden erreicht der Entwickler übrigens auch über die Schaltfläche »class side« (Abbildung 3).

Listing 3

Definition der abgeleiteten Klasse Shpere

01 Shapes subclass: #Sphere
02   instanceVariableNames: 'radius'
03   classVariableNames: ''
04   category: 'Shapes'

Listing 4 zeigt die Methoden der abgeleiteten Klasse aus Listing 3. Bei der Methode »initialize« (Zeile 1) handelt es sich um eine Konstruktorfunktion, das heißt, Smalltalk ruft sie beim Erzeugen eines Objekts auf. Will der Entwickler sie wie im vorliegenden Fall überschreiben, darf er den Ausdruck »super initialize.« nicht vergessen. Anderenfalls ginge der Aufruf der gleichnamigen Methode der Elternklasse schief.

Listing 4

Methoden der Klasse Sphere

01 initialize
02   super initialize.
03   radius := 0.
04
05 set: dim
06   radius := dim.
07
08 surface
09   ^ 12.56 * (radius * radius).
10
11 volume
12   ^ 12.56 / 3 * radius * radius * radius.

Zeile 3 belegt die Instanzvariable »radius« mit dem Wert »0« . Die Zeichenfolge »:=« agiert als Zuweisungsoperator, das Gleichheitszeichen als Vergleichsoperator. Da Instanzvariablen wie auch Klassenvariablen unter Smalltalk immer privat sind, bedarf es entsprechender Getter- und Setter-Methoden. Eine davon ist die Methode »set:« ab Zeile 5 für die Instanzvariable »radius« . Zudem überschreibt sie die gleichnamige abstrakte Methode aus Listing 2 und vermeidet so die unerwünschte Fehlermeldung.

Die Methode »surface« (Zeile 8) liest den Wert der Instanzvariablen in Zeile 9 aus und liefert als Ergebnis die Ausdehnung der Kugeloberfläche zurück. Die Methode »volume« (Zeile 10) geht bei der Volumenberechnung ähnlich vor. Nach dem Vorbild der Klasse »Sphere« lassen sich für andere dreidimensionale Körper weitere Klassen ableiten, beispielsweise die Klasse »Cubic« für einen Würfel mit dem Volumen von a3 und einer Oberfläche von 6a2.

Anonym

Auch die Definition der abgeleiteten Klasse »Accumulator« (Listing 5) verwendet in Zeile 1 die Klasse »Shapes« als Vorlage. Sie beschreibt jedoch kein geometrisches Objekt. Vielmehr akkumuliert sie Werte der Oberflächen und Volumina einer Liste geometrischer Objekte, bei denen es sich um »shapes« genannte Instanzvariablen handelt (Zeile 2).

Listing 5

Definition der Klasse Accumulator

01 Shapes subclass: #Accumulator
02   instanceVariableNames: 'shapes'
03   classVariableNames: ''
04   category: 'Shapes'

Listing 6 zeigt die Methoden der Klasse »Accumulator« . In der Konstruktorfunktion »initialize« (Zeile 1) erzeugt Zeile 3 eine leere Collection in der Instanzvariablen »shapes« . Collections bilden einen Typ vordefinierter und iterierbarer Container-Objekte unter Pharo. Die Methode »set:« (Zeile 5) agiert als Setter-Methode und fügt der Collection ein Element hinzu.

Listing 6

Methoden der Klasse Accumulator

01 initialize
02   super initialize.
03   shapes := OrderedCollection new.
04
05 set: obj
06   shapes add: obj.
07
08 surface
09   | sum |
10   sum := 0.
11   shapes do: [:obj | sum := sum + obj surface].
12   ^ sum.
13
14 volume
15   ^ shapes inject: 0 into: [:sum :obj | sum + obj volume].

Die Methode »surface« (Zeile 8) erzeugt in Zeile 9 zunächst die lokale Variable »sum« und initialisiert sie in der folgenden Zeile mit dem Wert »0« . Die Methode »do« iteriert in Zeile 11 über die Collection aus der Variablen »shapes« im Stile der Map-Funktion. Zusammen mit jedem Element der Collection ruft »do« den anonymen Funktionsblock »[:obj | sum := sum + obj surface]« auf, der das Element in der lokalen Variablen »obj« (links vom Pipe-Symbol) aufnimmt.

Da Smalltalk über einen lexikalischen Scope verfügt, vergrößert der Ausdruck »sum := sum + obj surface« den Wert der lokalen Variablen »sum« aus Zeile 9 durch Aufruf der Methode »surface« stetig um den Wert der Oberfläche des übergebenen Objekts. Die Methode »volume« (Zeile 14) geht ähnlich vor, verwendet zur Volumenberechnung mit »inject:into:« jedoch eine Methode, die der bekannten Reduce-Funktion entspricht.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Nachrichten-Zustellung

    Smalltalk ist rein objektorientiert und Vorbild für neuere Entwicklungen wie Objective-C oder Ruby. Als Grundelemente dienen Objekte und Nachrichten, mitgelieferte Klassen bestimmen den Funktionsumfang. Der Artikel stellt zwei Implementierungen vor, die Einsteigern und Profis gerecht werden.

  • Einführung

    DELUG-Käufer bekommen die doppelte Datenmenge zum einfachen Preis: Seite A der DVD enthält viel Material zur Entwicklungsumgebung Pharo sowie eine VM mit LXC-Containern. Die Rückseite bietet Videos von der Akademy 2015, ein E-Book über Debians Paketverwaltung und vieles mehr.

  • Schicke Klassiker

    Die Programmiersprachen Lisp und Smalltalk haben schon einige Jahrzehnte auf dem Buckel. Doch dank engagierter Communitys glänzen sie mit modernen Bibliotheken. Beim Umsortieren von Fußnoten und vor allem bei der Webprogrammierung zeigen sie, was in ihnen steckt.

  • ABC-Schütze

    C zählt trotz bekannter Probleme zu den populärsten Programmiersprachen. Eine der jüngeren Bewerberinnen um die Nachfolge ist D: Objektorientiert, inklusive Garbage Collection und Unit-Test-Funktionalität schleppt diese Sprache weit weniger Ballast mit sich herum als etwa C++.

  • Runter kommen sie alle

    Spiele-Programmierer rechnen mit physikalischen Formeln und setzen spezielle Tricks ein, um Grafiken realitätsnah zu animieren. Der als Perl-Wrapper verfügbare Simple Direct Media Layer (SDL) bietet ein leistungsfähiges Framework, um einfache 2D-Welten zu schaffen, hier eine Fallschirmsprung-Simulation.

comments powered by Disqus

Ausgabe 10/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.