43
OOP in Scala Seminar Softwareentwicklung mit Scala Wintersemester 2010/11 Martin Pfeiffer Friedrich Schiller Universit¨ at Jena Prof. Dr. Wolfram Amme Christoph Henniger Christian Schachtzabel 22. November 2010 m.pfeiff[email protected] OOP in Scala 22. November 2010 1 / 30

OOP - Scala

Embed Size (px)

Citation preview

Page 1: OOP - Scala

OOP in ScalaSeminar Softwareentwicklung mit Scala

Wintersemester 2010/11

Martin Pfeiffer

Friedrich Schiller Universitat JenaProf. Dr. Wolfram Amme

Christoph HennigerChristian Schachtzabel

22. November 2010

[email protected] OOP in Scala 22. November 2010 1 / 30

Page 2: OOP - Scala

Ubersicht

1 Klassen & Objekte

2 Klassenmember

3 Vererbung

4 Weitere Konzepte

[email protected] OOP in Scala 22. November 2010 2 / 30

Page 3: OOP - Scala

Klassen & Objekte

Klassen

Klassendefinition

Definition mit Schlusselwort class

Klassenname und Dateiname mussen nicht ubereinstimmen

Mehrere”public“ Klassen pro Datei zulassig

Mussen nicht im Ordner ihres Paketes definiert werden

Verwendung

Mit new werden neue Instanzen erzeugt

Kein delete, vernichten ubernimmt GC

Referenzsemantik wie in Java

[email protected] OOP in Scala 22. November 2010 3 / 30

Page 4: OOP - Scala

Klassen & Objekte

Klassen

Klassendefinition

Definition mit Schlusselwort class

Klassenname und Dateiname mussen nicht ubereinstimmen

Mehrere”public“ Klassen pro Datei zulassig

Mussen nicht im Ordner ihres Paketes definiert werden

Verwendung

Mit new werden neue Instanzen erzeugt

Kein delete, vernichten ubernimmt GC

Referenzsemantik wie in Java

[email protected] OOP in Scala 22. November 2010 3 / 30

Page 5: OOP - Scala

Klassen & Objekte

Klassen

class Person

{

var name : String = "";

}

object ClassesExample {

def main(args: Array[String]) : Unit = {

val peter = new Person()

peter.name = "Peter"

val horst = new Person()

horst.name = "Horst"

println("Persons name is: "+peter.name)

println("Persons name is: "+horst.name)

}

}

[email protected] OOP in Scala 22. November 2010 4 / 30

Page 6: OOP - Scala

Klassen & Objekte

Objekte

Objektdefinition

Objekte haben nur eine”Instanz“

Implementierung des Singleton Design Pattern

Definition mit Schlusselwort object

Verwendung

Referenzen kann Name des object zugewiesen werden

Verhalt sich wie Instanz einer Klasse

[email protected] OOP in Scala 22. November 2010 5 / 30

Page 7: OOP - Scala

Klassen & Objekte

Objekte

Objektdefinition

Objekte haben nur eine”Instanz“

Implementierung des Singleton Design Pattern

Definition mit Schlusselwort object

Verwendung

Referenzen kann Name des object zugewiesen werden

Verhalt sich wie Instanz einer Klasse

[email protected] OOP in Scala 22. November 2010 5 / 30

Page 8: OOP - Scala

Klassen & Objekte

Objekte - Beispiel

object Person{

var name : String = "";

}

// Die Referenzen peter und horst verweisen auf das selbe object

object ObjectExample {

def main(args: Array[String]) : Unit = {

val peter = Person

peter.name = "Peter"

val horst = Person

horst.name = "Horst"

println("Person name is: "+peter.name)

println("Person name is: "+horst.name)

}

}

[email protected] OOP in Scala 22. November 2010 6 / 30

Page 9: OOP - Scala

Klassenmember

Klassenmember

[email protected] OOP in Scala 22. November 2010 7 / 30

Page 10: OOP - Scala

Klassenmember

Membervariablen

Memberdefinition

var - Sind Variablen

val - Value - Sind Werte

Achtung - Alles in Scala ist per Default”public“

Type eines initialisierten Member optional

[email protected] OOP in Scala 22. November 2010 8 / 30

Page 11: OOP - Scala

Klassenmember

Membervariablen - Beispiel

class Person{

val name : String = "Default name"

//Type ergibt sich aus Wertzuweisung

var alter = 42

}

object MemberExample {

def main(args: Array[String]) : Unit = {

val peter = new Person()

//peter.name = "peter" -> Error - value nicht aenderbar

peter.alter = 43

}

}

[email protected] OOP in Scala 22. November 2010 9 / 30

Page 12: OOP - Scala

Klassenmember

Methoden

def methodenName (param1 : ParamType) : ReturnType =

{

//Methodenkoerper

}

Eigenschaften

Werden durch das Schlusselwort def definiert

Name der Methode erlaubt Sonderzeichen!

Parameterliste optional

Ruckgabetype optional wenn eideutig

Notwendig bei return und Rekursion

Bei einzeiligen Methodenkorper {} optional

Wert der letzten Anweisung wird automatisch zuruckgegeben

[email protected] OOP in Scala 22. November 2010 10 / 30

Page 13: OOP - Scala

Klassenmember

Methoden

def methodenName (param1 : ParamType) : ReturnType =

{

//Methodenkoerper

}

Eigenschaften

Werden durch das Schlusselwort def definiert

Name der Methode erlaubt Sonderzeichen!

Parameterliste optional

Ruckgabetype optional wenn eideutig

Notwendig bei return und Rekursion

Bei einzeiligen Methodenkorper {} optional

Wert der letzten Anweisung wird automatisch zuruckgegeben

[email protected] OOP in Scala 22. November 2010 10 / 30

Page 14: OOP - Scala

Klassenmember

Methoden - Beispiel

class SInt(i : Int){

val value : Int = i

def printValue() : Unit = { println(value) }

def +(other : SInt) : SInt = new SInt(value+other.value)

def ! = {

var k = 1

for(i <- 1 to value)

k *= i

new SInt(k)

}}

object MethodeExample{

def main(args: Array[String]): Unit= {

val i1 = new SInt(5)

val i2 = new SInt(2)

(i2 + i1).printValue

(i1!).printValue

}}

[email protected] OOP in Scala 22. November 2010 11 / 30

Page 15: OOP - Scala

Klassenmember

Hauptkonstruktoren

class Example(param1 : Paramtype)

{

val member : Paramtype = param1

}

Eigenschaften

Jede Klasse hat genau 1 Hauptkonstruktor

(Leere) Parameterliste direkt nach Klassennamen

Korper der Klasse ist Kontruktorkorper

[email protected] OOP in Scala 22. November 2010 12 / 30

Page 16: OOP - Scala

Klassenmember

Hauptkonstruktoren

class Example(param1 : Paramtype)

{

val member : Paramtype = param1

}

Eigenschaften

Jede Klasse hat genau 1 Hauptkonstruktor

(Leere) Parameterliste direkt nach Klassennamen

Korper der Klasse ist Kontruktorkorper

[email protected] OOP in Scala 22. November 2010 12 / 30

Page 17: OOP - Scala

Klassenmember

Hauptkonstruktoren - Beispiel

class Person(n : String, i : Int)

{

private val name = n

private var alter = i

}

object ConstructorExample {

def main(args: Array[String]) = {

val peter = new Person("peter", 42)

val horst = new Person("horst", 37)

}

}

[email protected] OOP in Scala 22. November 2010 13 / 30

Page 18: OOP - Scala

Klassenmember

Hauptkonstruktoren - Besonderheiten

Codereduzierung

Parameter optional mit var bzw. val

Fur var Parameter wird private var + Getter + Setter angelegt

Fur val Parameter wird private val + Getter angelegt

class Person(val name : String, var alter : Int)

object GetterSetterExample{

def main(args: Array[String]) = {

val peter = new Person("peter", 42)

println(peter.name)

//peter.name = "horst" -> Error

peter.alter = 43

}

}

[email protected] OOP in Scala 22. November 2010 14 / 30

Page 19: OOP - Scala

Klassenmember

Hauptkonstruktoren - Besonderheiten

Codereduzierung

Parameter optional mit var bzw. val

Fur var Parameter wird private var + Getter + Setter angelegt

Fur val Parameter wird private val + Getter angelegt

class Person(val name : String, var alter : Int)

object GetterSetterExample{

def main(args: Array[String]) = {

val peter = new Person("peter", 42)

println(peter.name)

//peter.name = "horst" -> Error

peter.alter = 43

}

}

[email protected] OOP in Scala 22. November 2010 14 / 30

Page 20: OOP - Scala

Klassenmember

Hilfskonstuktoren

Eigenschaften

Hilfskonstruktoren sind Methoden mit dem Namen this

() auch bei parameterlosen Konstruktor notwendig

Mussen sich in ihrer Signatur unterscheiden

Mussen als erste Anweisung einer anderen Konstuktor aufrufen

Dieser muss oberhalb des aktuellen definiert sein

Kein Ruckgabewert - auch nicht Unit

[email protected] OOP in Scala 22. November 2010 15 / 30

Page 21: OOP - Scala

Klassenmember

Hilfskonstruktoren - Beispiel

class Person(n : String, i : Int)

{

private val name = n

private var alter = i

def this(n : String) = this(n, 42)

def this() = this("unknown")

}

object ConstructorExample {

def main(args: Array[String]) = {

val peter = new Person("peter")

val horst = new Person("horst", 37)

val unknown = new Person

}

}

[email protected] OOP in Scala 22. November 2010 16 / 30

Page 22: OOP - Scala

Klassenmember

Getter & Setter in Scala

//Analog zu class Person(var name : String)

class Person(n : String)

{

private var _name : String = n

def name = _name

def name_= (n : String) = _name = n

}

Uniform Access Principle

Memberzugriff von Methodenaufruf nicht zu unterscheiden

Implementierung der Klasse kann geandert werden

[email protected] OOP in Scala 22. November 2010 17 / 30

Page 23: OOP - Scala

Klassenmember

Getter & Setter in Scala

//Analog zu class Person(var name : String)

class Person(n : String)

{

private var _name : String = n

def name = _name

def name_= (n : String) = _name = n

}

Uniform Access Principle

Memberzugriff von Methodenaufruf nicht zu unterscheiden

Implementierung der Klasse kann geandert werden

[email protected] OOP in Scala 22. November 2010 17 / 30

Page 24: OOP - Scala

Klassenmember

POJO’s in Scala

Problem mit Java Kompatibilitat

Java Beans erfodern getX(), setX() & isX() Methoden

Zahlreiche Frameworks setzen auf diesen Eigenschaften auf

Annotation @scala.reflect.BeanProperty bringt Bean Eigenschaften

class Person(@scala.reflect.BeanProperty val name : String,

@scala.reflect.BeanProperty var alter : Int)

object POJOExample {

def main(args: Array[String]) = {

val peter = new Person("peter", 42)

println(peter.getName())

}

}

[email protected] OOP in Scala 22. November 2010 18 / 30

Page 25: OOP - Scala

Klassenmember

POJO’s in Scala

Problem mit Java Kompatibilitat

Java Beans erfodern getX(), setX() & isX() Methoden

Zahlreiche Frameworks setzen auf diesen Eigenschaften auf

Annotation @scala.reflect.BeanProperty bringt Bean Eigenschaften

class Person(@scala.reflect.BeanProperty val name : String,

@scala.reflect.BeanProperty var alter : Int)

object POJOExample {

def main(args: Array[String]) = {

val peter = new Person("peter", 42)

println(peter.getName())

}

}

[email protected] OOP in Scala 22. November 2010 18 / 30

Page 26: OOP - Scala

Vererbung

Vererbung

[email protected] OOP in Scala 22. November 2010 19 / 30

Page 27: OOP - Scala

Vererbung

Vererbung

Eigenschaften

Scala kennt wie Java keine Mehrfachvererbung!

Definition

Vererbung durch Schlusselwort extends bei Klassendefinition

Es muss dabei ein Konstruktor der super Klasse aufgerufen werden

Kein Superkonstruktoraufruf fur Hilfskonstruktoren moglich

class Person (var name : String, val alter : Int){

def this(name : String) = this(name, 42)

}

class Dozent(name : String, var fach : String)

extends Person(name)

[email protected] OOP in Scala 22. November 2010 20 / 30

Page 28: OOP - Scala

Vererbung

Vererbung

Eigenschaften

Scala kennt wie Java keine Mehrfachvererbung!

Definition

Vererbung durch Schlusselwort extends bei Klassendefinition

Es muss dabei ein Konstruktor der super Klasse aufgerufen werden

Kein Superkonstruktoraufruf fur Hilfskonstruktoren moglich

class Person (var name : String, val alter : Int){

def this(name : String) = this(name, 42)

}

class Dozent(name : String, var fach : String)

extends Person(name)

[email protected] OOP in Scala 22. November 2010 20 / 30

Page 29: OOP - Scala

Vererbung

Vererbung

Eigenschaften

Scala kennt wie Java keine Mehrfachvererbung!

Definition

Vererbung durch Schlusselwort extends bei Klassendefinition

Es muss dabei ein Konstruktor der super Klasse aufgerufen werden

Kein Superkonstruktoraufruf fur Hilfskonstruktoren moglich

class Person (var name : String, val alter : Int){

def this(name : String) = this(name, 42)

}

class Dozent(name : String, var fach : String)

extends Person(name)

[email protected] OOP in Scala 22. November 2010 20 / 30

Page 30: OOP - Scala

Vererbung

Abstrakte Klassen

Definition

Abstrakte Klassen durch das Schlusselwort abstract

Notwendig wenn Klasse abst. Methoden oder Variablen enthalt

Instanzen konnen nur von nicht abstrakten Klassen erzeugt werden

Abstrakte Variablen & Methoden

Abstrakte Methoden sind Methoden ohne Korperz. B.: def print() : Unit

Abstrakte Variablen sind var & val ohne Zuweisungz. B.: val con : Connection

[email protected] OOP in Scala 22. November 2010 21 / 30

Page 31: OOP - Scala

Vererbung

Abstrakte Klassen

Definition

Abstrakte Klassen durch das Schlusselwort abstract

Notwendig wenn Klasse abst. Methoden oder Variablen enthalt

Instanzen konnen nur von nicht abstrakten Klassen erzeugt werden

Abstrakte Variablen & Methoden

Abstrakte Methoden sind Methoden ohne Korperz. B.: def print() : Unit

Abstrakte Variablen sind var & val ohne Zuweisungz. B.: val con : Connection

[email protected] OOP in Scala 22. November 2010 21 / 30

Page 32: OOP - Scala

Vererbung

Abstrakte Klassen - Beispiel

abstract class Connection

class USBConnection extends Connection{

def print(s : String) : Unit = {/*..*/}

}

abstract class Printer{

val con : Connection

def print(s : String) : Unit

}

class USBPrinter extends Printer{

val con = new USBConnection

def print(s : String) : Unit = con.print(s)

}

[email protected] OOP in Scala 22. November 2010 22 / 30

Page 33: OOP - Scala

Vererbung

Uberschreiben von Membern

Definition

Scala erlaubt das Uberschreiben von nicht abstrakten Membern

Dazu dient das Schlusselwort override

So deklarierte Methoden & Variablen mussen etwas uberschreiben

Test durch Compiler - Java hat nur @overrride Annotation

class Person(val name : String, var alter : Int){

override def toString() = {

"Person: - name: "+name+" alter: "+alter

}

}

[email protected] OOP in Scala 22. November 2010 23 / 30

Page 34: OOP - Scala

Vererbung

Uberschreiben von Membern

Definition

Scala erlaubt das Uberschreiben von nicht abstrakten Membern

Dazu dient das Schlusselwort override

So deklarierte Methoden & Variablen mussen etwas uberschreiben

Test durch Compiler - Java hat nur @overrride Annotation

class Person(val name : String, var alter : Int){

override def toString() = {

"Person: - name: "+name+" alter: "+alter

}

}

[email protected] OOP in Scala 22. November 2010 23 / 30

Page 35: OOP - Scala

Weitere Konzepte

Weitere Konzepte

[email protected] OOP in Scala 22. November 2010 24 / 30

Page 36: OOP - Scala

Weitere Konzepte

Companion Objects

Problem

Scala kennt im Gegensatz zu Java kein”static“

Es gibt nur object um Einzigartigkeit zu erzeugen uberschreiben

Losung

Eine Klasse & ein Object mit demselben Namen

Mussen in derselben Datei und im selben Paket deklariert werden

Bilden zusammen eine Companion Class bzw. Companion Object

Klasse kann auf private Object-Member zugreifen

[email protected] OOP in Scala 22. November 2010 25 / 30

Page 37: OOP - Scala

Weitere Konzepte

Companion Objects

Problem

Scala kennt im Gegensatz zu Java kein”static“

Es gibt nur object um Einzigartigkeit zu erzeugen uberschreiben

Losung

Eine Klasse & ein Object mit demselben Namen

Mussen in derselben Datei und im selben Paket deklariert werden

Bilden zusammen eine Companion Class bzw. Companion Object

Klasse kann auf private Object-Member zugreifen

[email protected] OOP in Scala 22. November 2010 25 / 30

Page 38: OOP - Scala

Weitere Konzepte

Companion Objects

class Person(val name : String, var alter : Int){

def printObjectCount = println(Person.counter)

}

object Person{

private var counter = 0

def getInstance(name : String, alter : Int) = {

counter += 1

new Person(name, alter)

}

}

object CompanionObjectExample {

def main(args : Array[String]) = {

val peter = Person.getInstance("peter", 42)

}

}

[email protected] OOP in Scala 22. November 2010 26 / 30

Page 39: OOP - Scala

Weitere Konzepte

Companion Objects - Apply Methode

Vorraussetzung

Im Companion Object gibt es eine apply Methode

Diese kann uber den Klassennamen benutzt werden

Oft als Factory-Methode benutzt

class Person(val name : String, var alter : Int)

object Person{

def apply(name : String, alter : Int)

= new Person(name, alter)

}

object ApplyExample{

def main(args : Array[String]) = {

val peter = Person("peter",42)

}

}

[email protected] OOP in Scala 22. November 2010 27 / 30

Page 40: OOP - Scala

Weitere Konzepte

Companion Objects - Apply Methode

Vorraussetzung

Im Companion Object gibt es eine apply Methode

Diese kann uber den Klassennamen benutzt werden

Oft als Factory-Methode benutzt

class Person(val name : String, var alter : Int)

object Person{

def apply(name : String, alter : Int)

= new Person(name, alter)

}

object ApplyExample{

def main(args : Array[String]) = {

val peter = Person("peter",42)

}

}

[email protected] OOP in Scala 22. November 2010 27 / 30

Page 41: OOP - Scala

Weitere Konzepte

Case Classes

Vorteile

Kann fur das Pattern Matching benutzt werden

Alle Konstruktorparameter automatisch als val

equals und hashCode werden automatisch erzeugt

toString mit Klassenname sowie allen Parametern

Automatische apply Methode mit allen Parametern

[email protected] OOP in Scala 22. November 2010 28 / 30

Page 42: OOP - Scala

Weitere Konzepte

Case Classes - Beispiel

abstract class Person(name : String)

case class Dozent(name: String, fachbereich : String) extends

Person(name)

case class Student(name: String, semester : Int) extends

Person(name)

object ApplyExample{

def main(args : Array[String]) = {

action(Student("peter", 7))

action(Dozent("horst", "Biologie"))

}

def action(person : Person) = person match{

case Student(name: String, semester : Int) =>

println(name+" ist im Semester "+semester)

case Dozent(name: String, fachbereich : String) =>

println(name+" gehoert zum Fachbereich "+fachbereich)

}}

[email protected] OOP in Scala 22. November 2010 29 / 30

Page 43: OOP - Scala

Fragen?

[email protected] OOP in Scala 22. November 2010 30 / 30