Scala. Abstrakte Elemente. Jevgeni Zelenkov. HM

Ähnliche Dokumente
FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Enumerations und innere Klassen

Ausdrücke in Scala. Funktionale Programmierung. Christoph Knabe FB VI

Einstieg in die Informatik mit Java

Vererbung und Traits

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Vererbung und Polymorphie

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Vererbung, Polymorphie

Wiederholung aus SWE2

Einstieg in die Informatik mit Java

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Programmieren in Java -Eingangstest-

Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.

Programmieren in Java

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Java für Bauingenieure

Enum-Klassen. Softwareentwicklung II (IB) Prof. Dr. Oliver Braun Letzte Änderung: :36. Enum-Klassen 1/12

Programmiermethodik 3. Klausur Lösung

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

JAVA für Nichtinformatiker - Probeklausur -

Java Einführung Abstrakte Klassen und Interfaces

Javakurs für Anfänger

Info B VL 8: Abstrakte Klassen & Interfaces

kurze Wiederholung class templates

1 Abstrakte Klassen, finale Klassen und Interfaces

Tag 8 Repetitorium Informatik (Java)

Javakurs für Anfänger

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Objektorientierte Programmierung Studiengang Medieninformatik

5 Vererbung. Subklassen, Superklassen, Pakete Zugriffsrechte

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

12 Abstrakte Klassen, finale Klassen und Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmieren in Java

Informatik II Übung 06. Benjamin Hepp 5 April 2017

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Scala: Klassen, Methoden und Objekte. von Simon Lerch

Theorie zu Übung 8 Implementierung in Java

Programmierkurs Java

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Javakurs für Anfänger

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Programmieren in Java

Programmiertechnik Vererbung & Polymorphismus für Fortgeschrittene

Kapitel 4: Klassen und Unterklassen

Programmierkurs Java

Java Einführung Vererbung und Polymorphie. Kapitel 13

Implementieren von Klassen

Objektorientierte Programmierung. Kapitel 12: Interfaces

Einführung in ActionScript

6. Globalübung (zu Übungsblatt 8)

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Java Schulung (Java 2 Java Development Kit 5 / 6)

Java Vererbung. Inhalt

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Institut für Informatik. Endterm Klausur zu Informatik I 20. Februar 2010

Objektorientierte Programmierung Studiengang Medieninformatik

Praktische Informatik 3: Funktionale Programmierung Vorlesung 13 vom : Scala Eine praktische Einführung

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Scala. Funktionale (Zustandslose) Objekte

Vererbung & Schnittstellen in C#

Crashkurs C++ Wiederholung

Javakurs für Anfänger

Programmierung und Angewandte Mathematik

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Info B VL 11: Innere Klassen/Collections

4. Vererbung. Idee der Vererbung. Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende Klassen vor:

Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen

Grundlagen. Felix Döring, Felix Wittwer 24. April Python-Kurs

Java I Vorlesung 6 Referenz-Datentypen

Javakurs 2013 Objektorientierung

Einführung in die Programmiersprache Java II

Transkript:

Scala. Abstrakte Elemente Jevgeni Zelenkov. HM. 2010.

Was sind abstrakte Elemente Abstrakte Elemente sind Elemente in Traits oder Klassen, die keine konkrete Implementierung haben. Abstrakte Klassen und Traits sind keine abstrakten Elemente! trait UnitConverter { type T def convert(x: T): T val original: T var converted: T class FeetToMetersConverter extends UnitConverter { type T = Double def convert(x: T) = x * 0.3048 val original = 10.0 var converted = convert (original)

Abstrakter Typ 1) deklariert einen abstrakten Typ, der später implementiert werden muss. 2) als Alias (macht den Code sauberer und lesbarer). trait Car { type Engine class DieselEngine class DieselCar extends Car { type Engine = DieselEngine class VeryImportantClassWhichMakesMagic class Navi { type gps = VeryImportantClassWhichMakesMagic def getcoordinates(gps)...

Type bounds 1/2 Definieren Sub-/ Superklassen für den Typen: type myclass <: Super type myclass >: Sub type myclass >: Sub <: Super trait Fuel trait Diesel extends Fuel trait BioDiesel extends Diesel trait BioDieselPlus extends BioDiesel class BioDieselPlusCar{ type suitablefuel <: BioDieselPlus class VWPassat extends BioDieselPlusCar { type suitablefuel = BioDieselPlus

Type bounds 2/2 Definieren Sub-/ Superklassen für den Typen: type myclass <: Super type myclass >: Sub type myclass >: Sub <: Super trait Fuel trait Diesel extends Fuel trait BioDiesel extends Diesel trait BioDieselPlus extends BioDiesel class NormalDieselCar{ type suitablefuel >: BioDieselPlus <: Diesel class VWGolf extends NormalDieselCar { type suitablefuel = Diesel // BioDiesel // BioDieselPlus

Abstrakte Methode Abstrakte Methode setzt nur Name und Typ ein, keinen Wert. Konkrete Implementierung setzt Wert ein. Abstrakte Methoden kann man entweder als konkrete def, val oder var implementieren. trait Greeting { def msg: String class ShipGreeting extends Greeting { def msg = Welcome aboard! //val msg = Welcome aboard! // OK //var msg = Welcome aboard! // OK

Abstrakte var 1/2 Abstrakte var setzt nur Name und Typ ein, keinen Wert. Konkrete Implementierung setzt Wert ein. Konkrete Implementierung muss ein var sein. def oder val werden nicht kompiliert. Getter and Setter werden eingefügt. trait Greeting { var msg: String class ShipGreeting extends Greeting { var msg = Welcome aboard! //val msg = Welcome aboard! // Fehler //def msg = Welcome aboard! // Fehler

Abstrakte var 2/2 Konkrete vars kommen mit Getter und Setter. Das gleiche gilt auch für abstrakte vars. Die 2 Traits unten sind identisch. Datenfeld für 'msg' in konkreter Klasse implementiert. trait Greeting { var msg: String trait Greeting { def msg : String def msg_=(x: String) // Getter // Setter

Abstrakte val Abstrakte val setzt nur Name und Typ ein, keinen Wert. Konkrete Implementierung setzt Wert ein. Konkrete Implementierung muss val sein. def oder var werden nicht kompiliert. trait Greeting { val msg: String class ShipGreeting extends Greeting { val msg = Welcome aboard! // var msg = Welcome aboard! // Fehler // def msg = Welcome aboard! // Fehler

Initialisierung von vals 1/2 vals werden manchmal wie Parameter für Traits benutzt, da Traits keinen Konstruktoren haben dürfen. 1. Trait wird initialisiert 2. Werte werden berechnet 3. anonyme Klasse wird mit den Werten initialisiert

Initialisierung von vals 2/2 Beispiel: trait Number{ val number: Double val inverse = inversify def inversify = 1.0 / number val x = 2 val t = new Number { val number = 10.0 * x println( t.inverse ) => Infinity

Lösungen Mögliche Lösungen: 1. pre-initialisierte Objektvariablen 2. lazy vals

pre-initialisierte Objektvariablen 1 Möglichkeit, Objektvariablen noch vor dem Klassenaufruf zu initialisieren. trait Number{ val number: Double val inverse = inversify def inversify = 1.0 / number val x = 2 new { val number = 10.0 * x with Number

pre-initialisierte Objektvariablen 2 pre-initialisierte Objektvariablen kann man nicht nur mit anonymen Klassen benutzen, sondern auch mit Objekten, normalen Klassen usw. trait Number{ val number: Double val inverse = inversify def inversify = 1.0 / number val i = 2 class NumberClass(n: Double) extends { val number = n * i with Number

pre-initialisierte Objektvariablen 3 "this" darf man in pre-initialisierten Objektvariablen nicht benutzen. trait Number{ val number: Double val inverse: Double val i = 2 class NumberClass extends { val number = 20 * i val inverse = 1/this.number // Fehler with Number

lazy vals Der Wert von lazy val wird erst dann berechnet, wenn er tatsächlich benutzt wird. trait Number{ val number: Double lazy val inverse = inversify def inversify = 1.0 / number val x = 2 new Number { val number = 10.0 * x

Scala type System 1/2 Beispiel: class Fuel abstract class Car{ def tankup (fuel: Fuel) class Diesel extends Fuel class DieselCar extends Car{ override def tankup (fuel: Diesel) { // Fehler class Gasoline extends Fuel val vwgolf: DieselCar = new Car vwgolf.tankup(new Gasoline) // Wäre möglich

Scala type System 2/2 Scala Lösung: class Fuel abstract class Car{ type SuitableFuel <: Fuel def tankup(fuel: SuitableFuel) class Diesel extends Fuel // OK class DieselCar extends Car{ type SuitableFuel = Diesel override def tankup (fuel: SuitableFuel) { class Gasoline extends Fuel val vwgolf: DieselCar = new DieselCar vwgolf.tankup(new Gasoline) // vwgolf.suitablefuel!= Gasoline

path-dependent Typen 1/2 Scala unterscheidet zwischen Inneren Klassen und pathdependent Typen. class Outer { class Inner val o1 = new Outer val o2 = new Inner Implementierung: (new Outer).Inner Typ: Outer#Inner new o1.inner new Outer#Inner // OK // Fehler

path-dependent Typen 2/2 Ähnlich wie die Inneren Klassen in Java: Inneren Klassen Path-dependent Typ Syntax Outer.Inner Outer#Inner Gebunden an einer Konkreter Instanz von Ausseren Klasse generell an eine Ausserklasse, nicht auf Konkrete Instanz davon Insanzierbar? Ja (Ausser - Klasse) Nein (Ausser - Objekt)

path-dependent Typen Beispiel: LIVE BEISPIELE

Enumeratoren 1/3 Enumeratoren in Scala = Objekte, die von "Enumeration"-Klasse abgeleitet sind. object Color extends Enumeration { val Red = Value val Green = Value val Blue = Value ///// ODER ////// object Color extends Enumeration { val Red, Green, Blue = Value

Enumeratoren 2/3 Enumeratoren kann man importieren. Object Color extends Enumeration{ val Red = Value import Color._ Red => res0: Color.Value = Color(0)

Enumeratoren 3/3 Scala Enums bietet zusätzliche Funktionalität, z.b.: Werte mit Namen überladen for-schleifen über Enum-Werte enum-wert mit Index ansprechen object Direction extends Enumeration { val North = Value("N") val East = Value("E") val South = Value("S") val West = Value("W") Direction(2) => Direction.Value = South("S")

Zusammenfassung Scala bietet eine gute Unterstützung für OO-Abstraktion. Das erlaubt die Entwicklung einer Anwendung möglichst lang abstrakt zu halten und die konkrete Implementierung ganz am Ende zu schreiben.

Scala. Abstrakte Elemente Danke für die Aufmerksamkeit! Fragen!?