Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen

Ähnliche Dokumente
Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Programmieren in Java

Faustregeln zu Zusicherungen

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Einstieg in die Informatik mit Java

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

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

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

3 Objektorientierte Konzepte in Java

Sind Kühe Tiere? oder Was lehrt uns die Objektorientierung? Prof. Dr. Th. Letschert

Einführung in die Programmierung

Vererbung. Was versteht man unter dem Begriff Vererbung?

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

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Innere Klassen in Java

Java Einführung Methoden in Klassen

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Theorie zu Übung 8 Implementierung in Java

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Einführung in die. objektorientierte Programmierung

Kapitel 6. Vererbung

Klassenbeziehungen & Vererbung

Java Einführung Abstrakte Klassen und Interfaces

Probeklausur: Programmierung WS04/05

Java I Vorlesung Vererbung und Sichtbarkeit

Präsentation Interfaces

Informatik II Übung 6 Gruppe 7

SWE1 / Übung 9 ( )

Java Vererbung. Inhalt

01. Grundprinzipien der Vererbung

Enumerations und innere Klassen

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Beziehungen zwischen Objekten

Objektorientierte Programmierung OOP

Überschreiben von Methoden

Objektorientierte Programmierung. Kapitel 16: Pakete, Zugriffsschutz

Übersicht. Vorstellung des OO-Paradigmas

Programmieren I. Kapitel 8. Vererbung

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

5.5.8 Öffentliche und private Eigenschaften

3. Konzepte der objektorientierten Programmierung

Angewandte Mathematik und Programmierung

Algorithmen und Datenstrukturen 07

Java für Computerlinguisten

Probeklausur: Programmierung WS04/05

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen

Typumwandlungen bei Referenztypen

Objektorientierte Programmierung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

4. AuD Tafelübung T-C3

5.6 Vererbung. Vererbung

Objektorientierte Programmierung Teil 1: Einführung

Der Operator this. Wir betrachten nochmals die Klassendefinition von Ballon.

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000

Einstieg in die Informatik mit Java

Informationsverarbeitung im Bauwesen

Programmieren in Java

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Kapitel 1: Anforderungen an moderne Software und ihre Umsetzung in Java

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Java: Vererbung. Teil 3: super()

Interfaces und Vererbung

5. Tutorium zu Programmieren

AuD-Tafelübung T-B5b

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2008/2009

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

8. Objektorientierte Programmierung. Informatik II für Verkehrsingenieure

Prinzipien Objektorientierter Programmierung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Workshop 6. Einführung in die objektorientierte Programmierung. Teil: Java mit BlueJ

Javakurs für Anfänger

C# im Vergleich zu Java

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Kapselung und Methodenbindung: Javas Designprobleme und ihre Korrektur. Dipl.-Inform. Peter Müller Prof. Arnd Poetzsch-Heffter Fernuniversität Hagen

Objekt-Orientierte Programmierung

Java II - Übungsgruppe

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

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

Objektorientierte Programmierung OOP Programmieren mit Java

Repetitorium Informatik (Java)

Vererbung. Martin Wirsing. Ziele. Vererbung

Prof. W. Henrich Seite 1

Einführung in die Programmierung 1

Programmierkurs Java. Vererbung. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck

13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

Java I Vorlesung 6 Referenz-Datentypen

Teil 2: OOP und JAVA (Vorlesung 11)

Klassen in Java. Klassen

Javakurs für Anfänger

Aufgabe 1: Quer durch Java (4 Punkte) super abstract abstract protected

Abschnitt 9: Schnittstellen: Interfaces

2. Vererbung und Polymorphie. Vererbung (1/2) Beispiel (1/2) Vererbung (2/2) Eine Unterklasse wird folgendermaßen definiert

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Einführung in die Informatik

Transkript:

Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen Th Letschert FH Gießen-Friedberg

Th. Letschert OOP 2 Sichtbarkeitsbeziehungen und Geheimnisprinzip Sichtbarkeitsbeziehungen realisieren Geheimnisprinzip Vererbung und Sichtbarkeitsbeziehungen Seite 2

Sichtbarkeitsbeziehungen: Mittel zur Realisation des Geheimnisprinzips Grundregel: Public/private/protected ist (nur) Softwaretechnik Sichtbarkeits-Attribute (public / private / protected) regeln Sichtbarkeitsbeziehungen Sichtbarkeitsbeziehungen sind nur zur Übersetzungszeit relevant sind (nur) Mittel zur Organisation des Quellcodes: sie unterstützen das Geheimnisprinzip: welcher (Autor von) Code X darf / muss welchen Teil von Code Y kennen / nutzen Halten die ihre Absprachen ein? Sichtbarkeitsbeziehungen haben nichts zu tun mit der Existenz von Objekten zur Laufzeit der Anwesenheit von Attributen / Methoden /... in einem Objekt irgendeinem realen Zugriffsschutz zur Laufzeit Compiler mein Code, wird so benutzt Entwickler A publoc class X { private static void f (int x) { awiofsjd Entwickler B mein Code, wird so benutzt publoc class X { private static void f (int x) { awiofsjd Seite 3

Geheimnisprinzip Modul: Quellcode-Komponente mit definierter Schnittstelle /Implementierung Geheimnisprinzip / Kapselung Trenne Quellcode-Komponente (Modul) streng in die Codeteile die zur Schnittstelle gehören von denen die zur Implementierung gehören Die Trennung von Schnittstelle und Implementierung nutzt den anderen (Entwicklern / Betreuern anderer Komponenten): Sie können klar erkennen was sie nutzen können und verstehen müssen um nutzen zu können nutzt uns (den Entwicklern / Betreuern dieser Komponente): Wir wissen was wir jederzeit ohne Absprache ändern können welche Funktionalität wir zu bieten und mit den Kunden abzusprechen haben Java unterstützt das Geheimnisprinzip Autor einer Code-Komponente kann explizit festlegen, ob ein Element der Komponente zur Schnittstelle oder der Implementierung gehört Code-Komponente (Modul) mit Schnittstelle und Implementierung = Geheimnis Das darf ich nutzen, muss ich kennen Nutzer Autor Schnittstelle Implementierung Das kann ich ohne Absprache ändern. Seite 4

Sichtbarkeit in Java: Paket- und Klassen-Sichtbarkeit Java: Zwei Module-Arten: Pakete (package) Klassen (class / interface) Zwei Arten der Sichtbarkeit Paket-Sichtbarkeit Auf was innerhalb eines Pakets kann zugegriffen werden Klassen-Sichtbarkeit Auf was innerhalb einer Klasse kann zugegriffen werden package classicalducks; public abstract class Duck { private FlyBehavior private QuackBehavior public Duck() {... public void swim(){... package classicalducks; flybehavior; quackbehavior; Klasse / Interface Klassen-Sichtbarkeit public Klassen-Sichtbarkeit default interface FlyBehavior { void fly(); package classicalducks; Klasse / Interface Paket-Sichtbarkeit public Paket-Sichtbarkeit default class FlyWithWings implements FlyBehavior { public void fly() {... Klasse / Interface Paket Seite 5

Geheimnisprinzip in Java: Code-Komponenten mit definierter Schnittstelle Package legt fest: Paket-Sichtbarkeit Paket besitzt: Class- / Interface- / Enum-Definitionen exportiert (macht sie sichtbar) für andere Packages Paketsichtbarkeit: private : - nicht erlaubt / unsinnig - default (kein Schlüsselwort) in gleichen Paket public Verwendung: Code anderer Pakete nicht OK ~> Paketlokale Verwendung: nur in Code Seite 6 ~> globale auch in Class / Interface legt fest: Klassen-Sichtbarkeit Klasse besitzt: Attribut; Methode; Lokale Definitionen: Class / Interface / Enum exportiert (macht sie sichtbar) für andere Klassen- / Interface-Definitionen Klassensichtbarkeit: private ~> Klassenlokale Verwendung: nur in Code der Klasse default (kein Schlüsselwort): von Klassen im gleichen OK ~> Paketlokale Verwendung: nur in Code vorausgesetzt Klasse hat die Paket-Sichtbarkeit public! anderes Paket public default Paket anderes Paket andere Klasse public default private Klasse Paket

Geheimnisprinzip in Java: Code-Komponenten mit definierter Schnittstelle Die Paket-Verschachtelung hat keinen Einfluss auf Sichtbarkeit! Code in anderem Paket anderes Paket Abgestufte Sichtbarkeit: Sichtbarkeit hängt vom Gesehen und vom Seher ab. Code in anderem Paket anderes Paket Code in anderer Klasse andere Klasse Schnittstelle zu anderen Paketen Paket public default Paket public default private Klasse Paket-Sichtbarkeit definiert Schnittstelle eines Pakets zu anderen Paketen Klassen-Sichtbarkeit definiert Schnittstelle einer Klasse / Schnittstelle zu anderen Klassen Schnittstelle zu anderen Klassen (in anderen Paketen) Schnittstelle zu anderen Klassen im gleichen Paket Seite 7

Th. Letschert OOP 2 Vererbung und Sichtbarkeitsbeziehungen Seite 8

Klassen, Subklassen und Sichtbarbeitsbeziehungen Vererbung bringt eine weitere Dimension in die Sichtbarkeits- Beziehungen von Klassen Zugreifende Klasse im gleichen Paket oder anderen Paket Zugreifende Klasse abgleitet oder nicht abgeleitet Code in anderem Paket Code in anderer abgeleiteter Klasse in anderem Paket abgeleitete Klasse anderes Paket Code in anderer Klasse andere Klasse Code in anderer abgeleiteter Klasse abgeleitete Klasse public default protected private Klasse Paket Seite 9

Klassen, Subklassen und Sichtbarbeitsbeziehungen: Beispiel class Basis { public protected private...a......c......d......b... public class Basis { public...a... protected private...c......d......b... class Abgeleitet extends Basis{ void f() {...a... // OK...b... // OK...c... // OK...d... // VERBOTEN beide Klassen im selben Paket class Abgeleitet extends Basis{ void f() {...a... // OK...b... // VERBOTEN...c... // OK...d... // VERBOTEN Klassen in unterschiedlichen Paketen Seite 10

Klassen, Subklassen und Sichtbarbeitsbeziehungen öffentliche Sichtbarkeit public Bestandteil der Schnittstelle der Klasse zu allen anderen Klassen default-sichtbarkeit (kein Schlüsselwort) Bestandteil der Schnittstelle der Klasse zu allen Klassen im gleichen Package Ableitungs-Sichtbarkeit Bestandteil der Schnittstelle der Klasse protected zu allen Klassen im gleichen Package zu allen abgeleiteten Klassen Keine Sichtbarkeit und private Nicht Bestandteil der Schnittstelle der Klasse: keine Verwendung ausserhalb der Klasse package a package b package c C1 protected void f() C2... f... C3... f... Die Sichtbarkeit per protected wird an Subklassen weiter gegeben Seite 11

Sichtbarkeit und Existenz Sichtbarkeit durch anderen Code und Existenz in einem Objekt haben nichts miteinander zu tun! Objekte der abgeleiteten Klasse enthalten private Methoden/Felder der Basisklasse auch und obwohl wenn sie in der abgeleiteten Klasse nicht zugreifbar sind name: Karla herzfrequenz: 80 Ein Objekt der Klasse Mensch Objekte der Klasse Mensch enthalten das Attribut herzfrequenz Im Code der Klasse Mensch darf auf das Attribut herzfrequenz nicht zugegriffen werden! Seite 12 class Tier { private int herzfrequenz;... class Mensch extends Tier{ private String name; public Student (String n) { name = n; public void freuen() { herzfrequenz++ //Verboten Manche finden das irritierend Es ist aber logisch!

Sichtbarkeitsbeziehungen: Zusammenfassung Klassen-Sichtbarkeit Die Klassen-Sichtbarkeit hängt ab 1. vom Kontext (Ort) des Zugriffs 2. seiner Relation zur Klasse des Zugegriffenen 3. den Sichtbarkeitsattributen des Zugegriffenen package p; import q.*; Kontext: Methode der Klasse K in Paket p class K {... void m() { c.member(); 1 Zugriff von K in p auf member in C in q Relation der Klassen: K!= C (fremd) K <= C (Ableitung) K == C (gleich) und der der Pakete: p = q p!= q 2 package q; class C { <attribut> member () {.. ; 3 Attribute: private, default, protected, public p = q K = C : public + default + protected + private OK K <= C : public + default + protected OK K!= C : public + default + protected OK p!= q (C muss Paket-Sichtbarkeit public haben) K = C : geht nicht K <= C : public + protected OK K!= C : public OK Seite 13

Sichtbarkeitsbeziehungen: Praxis Paket-Sichtbarkeit Pakete bestehen aus (recht eng) kooperierenden Klassen: public : exportierte, ausserhalb des Pakets nutzbare Klassen default : (Hilfs-) Klassen mit rein Paket-interner Verwendung Klassen-Sichtbarkeit Klassen bestehen aus Attributen und Methoden: Attribute (Klassen-/Instanz-Variablen): private Methoden die von Klassen im gleichen Paket verwendet werden (den Freunden): Methoden die von Klassen in anderen Paketen verwendet werden : public Methoden die von abgeleiteten Klassen in anderen Paketen sowie von Klassen im gleichen Paketen verwendet werden: protected default Seite 14

Sichtbarkeitsbeziehungen: Praxis / protected protected dieses Attribut sollte vermieden werden: private statt dessen! Grund: Mit protected hat eine Klasse eine drei- (statt zwei-) stufige Sichtbarkeit 1.sichtbar in allen Klassen 2.sichtbar in der Klasse und in abgeleiteten Klassen 3.sichtbar in der Klasse Die Schnittstelle zu einer anderen Klasse hängt auch noch davon ab, ob diese abgeleitet ist oder nicht. das 6. macht sie komplizierter 7. reduziert die Kapselung also: Klassen sollten anderen Klassen eine einheitliche Schnittstelle bieten, unabhängig davon ob die anderen abgeleitet sind oder nicht. Seite 15

Sichtbarkeitsbeziehungen: Praxis / protected class Tier { protected String name; public Tier() { name = "?"; public Tier(String name){ this.name = name; Kopplung: Konzept: Tiere haben einen Namen, dieses Attribut haben alle Arten von Tieren und wird von allen Tierarten in ihrer Weise genutzt. class Hund extends Tier { public Hund() { this.name = "Fifi"; public Hund(String name) { this.name = name; Der Autor von Hund muss die Konstruktoren von Tier und die Variable name kennen und korrekt benutzen. Der Autor von Tier darf weder die Konstruktoren, noch die Variable name ohne Absprachen ändern. - Für die Konstruktoren muss er mit allen Nutzern reden. - Für name muss er mit allen Autoren von abgeleiteten Klassen reden. Schlecht! Starke Kopplung zwischen der Klasse Tier und ihren Ableitungen. Seite 16

Sichtbarkeitsbeziehungen: Praxis / protected class Tier { private String name; public Tier() { name = "?"; public Tier(String name){ this.name = name; Kopplung: Konzept: Tiere haben einen Namen, dieses Attribut haben zwar alle Arten von Tieren, es gehört aber zum innersten Wesen dem Ur-Tier in jedem Tier - Dieses innerste Wesen, wird (nur) in der Klasse Tier verwaltet. class Hund extends Tier { public Hund() { super("fifi"); public Hund(String name) { super(name); Der Autor von Hund muss die Konstruktoren von Tier kennen und korrekt benutzen. Der Autor von Tier darf die Konstruktoren nicht ohne Absprachen ändern. Dazu muss er mit allen Nutzern reden. Gut! Schwache (schwächere) Kopplung zwischen der Klasse Tier und ihren Ableitungen. Seite 17

Sichtbarkeiten in UML apackage AClass - x : privatattr # y : protectedattr + publicmethod(): void X +Y - Z Klassen-Sichtbarkeit: - : private # : protected + : public : unbestimmt / public Paket-Sichtbarkeit: - : private + : public : unbestimmt / public Seite 18