OOP - Scala
-
Upload
fortytwoapps -
Category
Documents
-
view
704 -
download
0
Transcript of 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
Ubersicht
1 Klassen & Objekte
2 Klassenmember
3 Vererbung
4 Weitere Konzepte
[email protected] OOP in Scala 22. November 2010 2 / 30
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Fragen?
[email protected] OOP in Scala 22. November 2010 30 / 30