OOP - Scala

  • View
    658

  • Download
    0

Embed Size (px)

Text of OOP - Scala

  • 1. OOP in Scala Seminar Softwareentwicklung mit Scala Wintersemester 2010/11 Martin Pfeier Friedrich Schiller Universitat Jena Prof. Dr. Wolfram Amme Christoph Henniger Christian Schachtzabel 22. November 2010 m.pfeier@uni-jena.de OOP in Scala 22. November 2010 1 / 30

2. Ubersicht 1 Klassen & Objekte 2 Klassenmember 3 Vererbung 4 Weitere Konzepte m.pfeier@uni-jena.de OOP in Scala 22. November 2010 2 / 30 3. Klassen & Objekte Klassen Klassendenition Denition mit Schlusselwort class Klassenname und Dateiname mussen nicht ubereinstimmen Mehrere public Klassen pro Datei zulassig Mussen nicht im Ordner ihres Paketes deniert werden Verwendung Mit new werden neue Instanzen erzeugt Kein delete, vernichten ubernimmt GC Referenzsemantik wie in Java m.pfeier@uni-jena.de OOP in Scala 22. November 2010 3 / 30 4. Klassen & Objekte Klassen Klassendenition Denition mit Schlusselwort class Klassenname und Dateiname mussen nicht ubereinstimmen Mehrere public Klassen pro Datei zulassig Mussen nicht im Ordner ihres Paketes deniert werden Verwendung Mit new werden neue Instanzen erzeugt Kein delete, vernichten ubernimmt GC Referenzsemantik wie in Java m.pfeier@uni-jena.de OOP in Scala 22. November 2010 3 / 30 5. 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) } } m.pfeier@uni-jena.de OOP in Scala 22. November 2010 4 / 30 6. Klassen & Objekte Objekte Objektdenition Objekte haben nur eine Instanz Implementierung des Singleton Design Pattern Denition mit Schlusselwort object Verwendung Referenzen kann Name des object zugewiesen werden Verhalt sich wie Instanz einer Klasse m.pfeier@uni-jena.de OOP in Scala 22. November 2010 5 / 30 7. Klassen & Objekte Objekte Objektdenition Objekte haben nur eine Instanz Implementierung des Singleton Design Pattern Denition mit Schlusselwort object Verwendung Referenzen kann Name des object zugewiesen werden Verhalt sich wie Instanz einer Klasse m.pfeier@uni-jena.de OOP in Scala 22. November 2010 5 / 30 8. 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) } } m.pfeier@uni-jena.de OOP in Scala 22. November 2010 6 / 30 9. Klassenmember Klassenmember m.pfeier@uni-jena.de OOP in Scala 22. November 2010 7 / 30 10. Klassenmember Membervariablen Memberdenition var - Sind Variablen val - Value - Sind Werte Achtung - Alles in Scala ist per Default public Type eines initialisierten Member optional m.pfeier@uni-jena.de OOP in Scala 22. November 2010 8 / 30 11. 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 } } m.pfeier@uni-jena.de OOP in Scala 22. November 2010 9 / 30 12. Klassenmember Methoden def methodenName (param1 : ParamType) : ReturnType = { //Methodenkoerper } Eigenschaften Werden durch das Schlusselwort def deniert 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 m.pfeier@uni-jena.de OOP in Scala 22. November 2010 10 / 30 13. Klassenmember Methoden def methodenName (param1 : ParamType) : ReturnType = { //Methodenkoerper } Eigenschaften Werden durch das Schlusselwort def deniert 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 m.pfeier@uni-jena.de OOP in Scala 22. November 2010 10 / 30 14. 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 Error peter.alter = 43 } } m.pfeier@uni-jena.de OOP in Scala 22. November 2010 14 / 30 19. 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 } } m.pfeier@uni-jena.de OOP in Scala 22. November 2010 14 / 30 20. 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 deniert sein Kein Ruckgabewert - auch nicht Unit m.pfeier@uni-jena.de OOP in Scala 22. November 2010 15 / 30 21. 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 } } m.pfeier@uni-jena.de OOP in Scala 22. November 2010 16 / 30 22. 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 Memberzugri von Methodenaufruf nicht zu unterscheiden Implementierung der Klasse kann geandert werden m.pfeier@uni-jena.de OOP in Scala 22. November 2010 17 / 30 23. 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 Memberzugri von Methodenaufruf nicht zu unterscheiden Implementierung der Klasse kann geandert werden m.pfeier@uni-jena.de OOP in Scala 22. November 2010 17 / 30 24. Klassenmember POJOs in Scala Problem mit Java Kompatibilitat Java Beans erfodern getX(), setX() & isX() Methoden Zahlreiche Frameworks setzen auf diesen Eigenschaften auf Annotation @scala.reect.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()) } } m.pfeier@uni-jena.de OOP in Scala 22. November 2010 18 / 30 25. Klassenmember POJOs in Scala Problem mit Java Kompatibilitat Java Beans erfodern getX(), setX() & isX() Methoden Zahlreiche Frameworks setzen auf diesen Eigenschaften auf Annotation @scala.reect.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()) } } m.pfeier@uni-jena.de OOP in Scala 22. November 2010 18 / 30 26. Vererbung Vererbung m.pfeier@uni-jena.de OOP in Scala 22. November 2010 19 / 30 27. Vererbung Vererbung Eigenschaften Scala kennt wie Java keine Mehrfachvererbung! Denition Vererbung durch Schlusselwort extends bei Klassendenition Es muss dabei ein Konstruktor der super Klasse aufgerufen werden Kein Superkonstruktoraufruf fur Hilfskonstruktoren moglich m.pfeier@uni-jena.de OOP in Scala 22. November 2010 20 / 30 28. Vererbung Vererbung Eigenschaften Scala kennt wie Java keine Mehrfachvererbung! Denition Vererbung durch Schlusselwort extends bei Klassendenition 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) m.pfeier@uni-jena.de OOP in Scala 22. November 2010 20 / 30 29. Vererbung Vererbung Eigenschaften Scala kennt wie Java keine Mehrfachvererbung! Denition Vererbung durch Schlusselwort extends bei Klassendenition 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) m.pfeier@uni-jena.de OOP in Scala 22. November 2010 20 / 30 30. Vererbung Abstrakte Klassen Denition 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 Korper z. B.: def print() : Unit Abstrakte Variablen sind var & val ohne Zuweisung z. B.: val con : Connection m.pfeier@uni-jena.de OOP in Scala 22. November 2010 21 / 30 31. Vererbung Abstrakte Klassen Denition 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