Dziedziczenie. » Dodawanie nowych elementów klasy (składowych funkcyjnych, danych składowych)» Modyfikacje odziedziczonych składowych funkcyjnych

Podobne dokumenty
Programowanie obiektowe i zdarzeniowe

Polimorfizm. dr Jarosław Skaruz

Klasy abstrakcyjne, interfejsy i polimorfizm

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie obiektowe

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Dokumentacja do API Javy.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

Dziedziczenie. dr Jarosław Skaruz

Programowanie obiektowe - 1.

Kurs WWW. Paweł Rajba.

Wykład 7: Pakiety i Interfejsy

Programowanie obiektowe

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe

Przykład -

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Wykład 5 Okna MDI i SDI, dziedziczenie

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Aplikacje w środowisku Java

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Diagramy klas. dr Jarosław Skaruz

Podstawy programowania obiektowego

Dziedziczenie. Tomasz Borzyszkowski

TEMAT : KLASY DZIEDZICZENIE

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

.NET Klasy, obiekty. ciąg dalszy

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Zaawansowane programowanie w C++ (PCP)

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Enkapsulacja, dziedziczenie, polimorfizm

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Wykład 6: Dziedziczenie

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Wykład 4: Klasy i Metody

Projektowanie obiektowe. Roman Simiński Polimorfizm

PHP 5 język obiektowy

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Materiały do zajęć VII


Wykład 9: Polimorfizm i klasy wirtualne

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Metodyki zwinne wytwarzania oprogramowania

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Wprowadzenie do programowanie obiektowego w języku C++

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Definiowanie własnych klas

Zaawansowane programowanie w C++ (PCP)

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Klasy cd. Struktury Interfejsy Wyjątki

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Wykład 8: klasy cz. 4

Wykład 1: Wprowadzenie

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Pakiety i interfejsy. Tomasz Borzyszkowski

Podstawy programowania. Programowanie obiektowe

Czym jest polimorfizm?

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Podstawy Języka Java

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

KLASY, INTERFEJSY, ITP

Programowanie obiektowe. Obiekt Klasa Składnia klasy: Interfejsy Składnia interfejsu: Metody Składnia instrukcji Sub: Składnia instrukcji function:

Programowanie w Internecie. Java

Podstawa: Bruce Eckel, Thinking in Java, Second Ed., Prentice Hall, 1998 The JavaLanguage Environment, A white Paper, Sun, Oct.

Programowanie obiektowe w VB cz 2

Aplikacje w środowisku Java

Interfejsy i klasy wewnętrzne

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe

Programowanie obiektowe

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

1. Klasa typu sealed. Przykład 1. sealed class Standard{ class NowyStandard:Standard{ // błd!!!

Programowanie w środowiskach graficznych. Wykład 3 Język C#

TEMAT : KLASY POLIMORFIZM

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Java: interfejsy i klasy wewnętrzne

Programowanie obiektowe

UML a kod. C++, Java i C#

Technologie i usługi internetowe cz. 2

Programowanie w Javie wykład 8 Interfejsy

Programowanie obiektowe

Technologie obiektowe

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Transkrypt:

Dziedziczenie Dziedziczenie umożliwia definiowanie nowej klasy przez rozbudowanie już istniejącej. Klasa wprowadzana całkowicie dziedziczy elementy starej klasy.» Dodawanie nowych elementów klasy (składowych funkcyjnych, danych składowych)» Modyfikacje odziedziczonych składowych funkcyjnych

Dziedziczenie Systematyka (gr. systematikos stanowiący układ, system) jest to układ (czyli system) przedmiotów lub pojęć danej nauki, a zarazem także (pod-)dziedzina danej nauki zajmująca się klasyfikowaniem jej przedmiotów i pojęć (czyli inaczej taksonomia). Arystoteles był pierwszym powszechnie znanym systematykiem Systematycy kategoryzują część świata, tworzą hierarchię kategorii od ogólnych do szczegółowych.

Dziedziczenie uogólnione Pojazdy transportowe Pojazd naziemny Pojazd powietrzny Pojazd wodny Samochód Rower Sanki specjalizowane TIR Autobus Samochód dostawczy

Dziedziczenie - Względnie niewielka liczba cech oraz czynności, które mogą być przyporządkowane do ogólnej kategorii - W miarę przesuwania się w dół hierarchii ku bardziej specjalistycznym kategoriom, dołączamy specjalistyczne cechy oraz czynności (nie związane z bardziej ogólnymi kategoriami) - Czytanie w górę jest zawsze prawdziwe relacja JEST KAŻDY ROWER jest POJAZDEM NAZIEMNYM jest prawdziwe ale KAŻDY POJAZD TRANSPORTOWY jest SANKAMI nie.

Dziedziczenie Specyfikacja klasy bazowej w C#: class SportsCar : Car Specyfikacja klasy bazowej w Java: class SportsCar extends Car

Dziedziczenie - przesłanianie class Samochod public virtual void JedzDoPrzodu() //... Metod wirtualna class SamochodSportowy : Samochod public override void JedzDoPrzodu() //...

Dziedziczenie Aby przesłaniania działało prawidłowo: - należy dołączyć słowo virtual w metodzie klasy bazowej - należy dołączyć słowo override w metodzie przesłaniającej Metoda virtual nie może być jednocześnie private Metoda przesłaniająca musi mieć tę samą nazwę, liczbę, sekwencję i typy parametrów. Aby uniemożliwić wykorzystanie klasy jako klasy bazowej, można zadeklarować ją jako zamkniętą (sealed)

Dziedziczenie Słowo kluczowe protected (modyfikator dostępu) zapewnia taki sam poziom dostępu jak private, ale ponadto umożliwia dostęp do danej z klasy z klas z niej wyprowadzonych.

Polimorfizm Technika ściśle związana z dziedziczeniem zwykle uważana za najważniejszą zaletę technologii obiektowych Jeśli do obiektu zostanie wysłany komunikat, to obiekt musi mieć odpowiednią metodę, aby móc odpowiedzieć. W hierarchii dziedziczenia podklasy przejmują interfejsy po swoich nadklasach. Każda klasa jest osobnym bytem, może wymagać innego rodzaju reakcji na ten sam komunikat.

Polimorfizm Shape #area : double +getarea() : double Rectangle -length -width +getarea() : double -radius Circle +getarea() : double Różne zachowanie różne implementacje metod Technologie obiektowe

Kompozycja - Tworzenie obiektów przy pomocy innych obiektów. - Jest rodzajem silnej agregacji całość-część - Relacja kompozycji polega na tym, że: - instancja reprezentująca część należy w danym momencie tylko do jednej instancji złożonej - część musi zawsze należeć do jakiejś całości - instancja złożona jest odpowiedzialna za tworzenie i usuwanie swoich części - po usunięciu instancji złożonej, wszystkie jej części muszą zostać usunięte - Agregacja jest rodzajem kompozycji bez powyższych ograniczeń Zgodnie z wytycznymi twórców UML unikaj stosowania agregacji. Jeśli to możliwe używaj kompozycji Java/.NET jest tylko kompozycja

Dziedziczenie i kompozycja Tworzenie nowych obiektów na bazie innych obiektów. Dziedziczenie to relacja jest, a kompozycja to relacja ma

Przykład class Car public virtual void MoveForward() Console.WriteLine( Do przodu ); class RacingCar : Car public override void MoveForward() Console.WriteLine( Szybka jazda do przodu ); public void StartOnBoardCamera() Console.WriteLine("Kamera włączona"); class FamilyCar : Car public override void MoveForward() Console.WriteLine("Wolno i bezpiecznie do przodu"); Technologie obiektowe

Obiekt klasy potomnej Car mycar; mycar = new RacingCar(); RacingCar myracingcar; MyRacingCar = new Car(); Car MoveForward() mycar.moveforward(); mycar.startonboardcamera(); //Nieprawidłowe RacingCar MoveForward() StartOnBoardCamera()

Wiązanie dynamiczne Car mycar; mycar = new RacingCar(); mycar.moveforward(); Czy zostanie wywołana metoda z klasy Car czy z klasy mycar? Środowisko musi podjąć ważną decyzję którą metode MoveForward uruchomić z klasy Car czy z klasy RacingCar?

Wiązanie dynamiczne Car mycar; Kompilator napotykając wiersz: mycar.moveforward(); Nie ma możliwości dowiedzieć się czy mycar będzie zawierała obiekt Car, RacingCar czy FamilyCar. Wiązanie dynamiczne, późne wiązanie faktyczna implementacja, którą ta nazwa reprezentuje jest określana dynamiczne podczas wykonywania programu.

Polimorfizm Polimorfizm oznacza zdolność do przyjmowania wielu postaci (wielopostaciowość) Stosowanie jednej zmiennej jako referencji do obiektów różnych klas i umożliwienie dzięki mechanizmowi wiązania dynamicznego, automatycznego wywołania metody zaimplementowanej w danym obiekcie. Wiązanie dynamiczne to po prostu fizyczna realizacja abstrakcyjnego pojęcia polimoforfizmu.

Metoda abstrakcyjna Metoda abstrakcyjna zawiera wyłącznie sam nagłówek bez implementacji Wymaga zapewnienia implementacji w klasach dziedziczących Kiedy klasa zawiera przynajmniej jedną metodę abstrakcyjną, to sama musi być również abstrakcyjna. Nie można utworzyć instancji klasy abstrakcyjnej. Słowo kluczowe abstract Metoda abstrakcyjna staje się niejawnie metodą wirtualną.

Klasy abstrakcyjne Nie możemy utworzyć instancji klasy abstrakcyjnej, jednak możemy zadeklarować zmienną jej typu referencyjnego. Nieabstrakcyjne klasy, których instancje można tworzyć bez przeszkód, nazywa się klasami konkretnymi. Akcesory get oraz set właściwości mogą być również deklarowane jako abstract

Kształty abstract class Shape public abstract void DrawYourself(); class Triangle : Shape public override void DrawYourself() Console.WriteLine(" * "); Console.WriteLine(" * * "); Console.WriteLine(" * * "); Console.WriteLine(" * * "); Console.WriteLine(" ********* "); class Rectangle : Shape public override void DrawYourself() Console.WriteLine(" ********* "); Console.WriteLine(" * * "); Console.WriteLine(" * * "); Console.WriteLine(" * * "); Console.WriteLine(" ********* "); class Circle : Shape public override void DrawYourself() Console.WriteLine(" *** "); Console.WriteLine(" * * "); Console.WriteLine(" * * "); Console.WriteLine(" * * "); Console.WriteLine(" *** ");

Kształty cd. class Program static void Main(string[] args) Shape myshape; Random r = new Random(); List<Shape> shapes=new List<Shape>(); Technologie obiektowe double los; for (int i = 0; i < 3; i++) los=r.next(3); if (los == 0) shapes.add(new Triangle()); else if (los == 1) shapes.add(new Rectangle()); else shapes.add(new Circle()); foreach (Shape element in shapes) element.drawyourself(); Console.ReadKey(); * * * * * * * ********* *** * * * * * * *** ********* * * * * * * ********* * * * * * * * ********* * * * * * * * ********* ********* * * * * * * *********

Tożsamość klasy Shape myshape=new Rectangle(); Obiekt klasy Rectangle() traci część swojej tożsamości. Na poziomie kodu źródłowego MyShape nie jest w stanie nam wskazać referencji do odpowiedniej klasy. class Rectangle : Shape double width=20,height=20; public override void DrawYourself() Console.WriteLine(" ********* "); Console.WriteLine(" * * "); Console.WriteLine(" * * "); Console.WriteLine(" * * "); Console.WriteLine(" ********* "); Console.WriteLine(myShape.Height+'' ''+myshape.width); Error 2 'ConsoleApplication8.Shape' does not contain a definition for 'height' and no extension method 'height' accepting a first argument of type 'ConsoleApplication8.Shape' could be found Technologie obiektowe

Operator is Operator is może sprawdzić, czy zmienna odnosi się do obiektu określonego typu. Wynikiem sprawdzenia jest true/false bool Console.WriteLine(myShape is Rectangle); Rectangle rect; if (myshape is Rectangle) rect = (Rectangle)myShape; Console.WriteLine(rect.width + " " + rect.height);

Rzutowanie Car mycar=new RacingCar(); Wszystkie elementy klasy, które można wywołać z Car można też wywołać z RacingCar. Ponieważ Car znajduje się wyżej w hierarchi dziedziczenia, takie przypisania wymaga rzutowania w górę Rectangle rect=(rectangle)myshape; Jeśli jesteśmy pewni, że myshape odnosi się do Rectangle!! Rzutowanie w dół wymaga operatora (<T>)

Rzutowanie Uwaga: myshape = new Circle(); Rectangle rect; rect = (Rectangle)myShape; Unable to cast object of type 'ConsoleApplication8.Circle' to type 'ConsoleApplication8.Rectangle'.

Operator as Operator as umożliwia kontrolowany proces rzutowania w dół. myshape = new Rectangle(); Rectangle rect= myshape as Rectangle; if(rect!=null) Console.WriteLine(rect.width); OK myshape = new Circle(); Rectangle rect= myshape as Rectangle; if(rect!=null) Console.WriteLine(rect.width); NULL

System.Object Biblioteka klas.net zawiera klasę o nazwie System.Object, z które ostatecznie wyprowadzane są wszystkie klasy Jeżeli tworzymy klasę bez określenie jej klasy bazowej, C# automatycznie ustawia klasę bazową jako System.Object. Hierarchia klas zawsze ma klasę stanowiącą najwyższe ogniwo w C# jest to zawsze System.Object

System.Object Każdy obiekt jest obiektem klasy System.Object foreach (Shape element in shapes) Console.WriteLine(element is System.Object); element.drawyourself(); Najczęściej wykorzystywaną metodą z klasy System.Object jest ToString() True, true, true foreach (Shape element in shapes) Console.WriteLine(element is System.Object); Console.WriteLine(element.GetType()); //element.drawyourself(); True ConsoleApplication8.Triangle True ConsoleApplication8.Triangle True ConsoleApplication8.Circle

Kształty cd. Klasa Shape, zawiera metodę DrawYourself zadeklarowaną jako abstract, która obliguje każdą klasę pochodzącą od Shape do zaimplementowania tej metody (z tą samą sygnaturą i typem zwracanym). Każda klasa dziedzicząca musi wypełnić kontrakt: Ja klasa pochodząca od Shape, przysięgam niniejszym implementować każdą metodę abstrakcyjną zawartą w Shape albo sama będę abstrakcyjna Klasa abstrakcyjna Shape nie oferuje swoim potomkom nic poza powyższym zobowiązaniem.

Klasa abstrakcyjna interfejs Konstrukcja języka programowania zwana interfejsem klasa abstrakcyjna, jedynie z funkcjami abstrakcyjnymi. Klasa może implementować interfejs. Wówczas przyrzeka implementować składowe funkcyjne interfejsu. Problem dynamicznego wiązania i polimorfizmu bez zmian. Interfejs oferuje to samo.

Klasa abstrakcyjna a interfejs Syntaktycznie i semantycznie klasy abstrakcyjne i interfejsy są spokrewnione. Interfejsy mogą zawierać jedynie funkcje abstrakcyjne, a klasy abstrakcyjne jeszcze składowe danych i normalne funkcje. Implementacja wielu interfejsów nie daje takich samych potencjalnych problemów, jak wielokrotne dziedziczenie, ponieważ zderzenia składowych danych i implementacji nie istnieją. Klasa może mieć co najwyżej jedną klasę bazową i implementować nieograniczoną liczbę interfejsów.

Interfejs interface IDrawable void DrawYourself(); class Triangle : IDrawable public void DrawYourself() Console.WriteLine(" TROJKAT "); class Rectangle : IDrawable public double width = 20, height = 20; public void DrawYourself() Console.WriteLine(" PROSTOKAT "); class Circle : IDrawable public void DrawYourself() Console.WriteLine(" KOLKO ");

Interfejs Interfejsy stosuje się, kiedy dla kilku klas potrzebne są wspólne nagłówki funkcji, których nie ma w żadnej wspólnej klasie przodka. Umożliwia to zastosowanie polimorfizmu w zbiorze klas, niezależnie od ich położenia i hierarchii.

Klasy abstrakcyjne - nie można stworzyć ich instancji - specjalny typ klas, gdzie można mieć funkcje bez implementacji - klasa może dziedziczyć tylko z 1 klasy (C#, Java) dotyczy to równie klas abstrakcyjnych - zapewnia domyśle zachowania dla części elementów, zmuszając programistów do zaimplementowania pozostałych - cel: zapewnienie że coś zostanie zaimplementowane - klasa może dziedziczyć po klasie abstrakcyjnej nie implementując wszyskich metod też klasa abstrakcyjna - tylko z klasy z zaimplementowanymi wszystkimi metodami może powstać obiekt Związek : JEST CZYMŚ np. student JEST Osobą, Pracownik JEST osobą

Interfejsy - nie można stworzyć obiektów - specjalny typ klas abstrakcyjnych, gdzie WSZYSTKIE elementy nie mają implementacji - pozwala na polimorfizm. - dostarcza kontrakt, aby zapewnić zachowanie - klasa która implementuje interfejs MUSI zawierać pełną implementację, w przeciwnym razie kompilator zwróci błą - relacja MOŻE ZROBIĆ Trójkąt MOŻE rysować (Triangle implements Idrawable).

Wstęp do modelowania obiektowego - Jeśli mamy szczęście już na początku prac nad projektem dysponujemy pełną wiedzą nt. Kształtu przyszłego systemu. - Reakcja łańcuchowa - Wprowadzenie nawet najmniejszej zmiany, wymagają bardzo dużych nakładów pracy

Symptomy złego projektu Sztywność - brak elastyczności - uniemożliwia wprowadzenie do systemu nawet najdrobniejszych zmian - projekt można uznać za sztywny, jeśli pojedyncza zmiana powoduje całą serię następujących po sobie zmian w modułach zależnych - Zadanie okazało się bardziej skomplikowane niż sądzilismy

Symptomy złego projektu Wrażliwość - tendencja do ulegania uszkodzeniom lub usterkom w wielu różnych miejscach wskutek wprowadzenia nawet najdrobniejszych zmian - często pojawiają się w obszarach na pozór nie związanych ze zmienianym fragmentem Programiści wiedzą że takie moduły wymagają przeprojektowania, ale nikt nie chce podjąć się tego trudnego zadania.

Symptomy złego projektu Nieelastyczność - System jest nieelastyczny, jeśli zawiera elementy, które choć teoretycznie mogłyby zostać wykorzystane w innych systemach nie mogą być oderwane od oryginalnego systemu Niedostosowanie do rzeczywistości - niedostosowanie oprogramowania - niedostosowanie środowiska (niefektywne)

Symptomy złego projektu Nadmierna złożoność - system zawiera elementy, które w danej chwili są zbędne - programiści, próbują przedwcześnie przewidywać potencjalne zmiany wymagań Niepotrzebne powtórzenia - copy & paste Nieprzejrzystość - kod jest niezrozumiały, trudny do odczytania - Kod który ewoluuje, zwykle staje się nieprzejrzysty -