Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Podobne dokumenty
Klasy abstrakcyjne i interfejsy

Języki i techniki programowania Ćwiczenia 4 Wzorce

Języki i techniki programowania Ćwiczenia 2

Polimorfizm. dr Jarosław Skaruz

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

Wykład 9: Polimorfizm i klasy wirtualne

Dokumentacja do API Javy.

Dziedziczenie. dr Jarosław Skaruz

TEMAT : KLASY DZIEDZICZENIE

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

Klasy abstrakcyjne, interfejsy i polimorfizm

PHP 5 język obiektowy

Aplikacje w środowisku Java

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe w języku

Programowanie 2. Język C++. Wykład 9.

Programowanie obiektowe

Java: interfejsy i klasy wewnętrzne

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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

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

Przykład -

Zaawansowane programowanie w C++ (PCP)

Dziedziczenie. Tomasz Borzyszkowski

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe

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

Mechanizm dziedziczenia

Dziedziczenie. Zadanie 1

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

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

Wykład 9: Metody wirtualne i polimorfizm

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Technologie i usługi internetowe cz. 2

Programowanie obiektowe

Wykład 5 Okna MDI i SDI, dziedziczenie

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Interfejsy i klasy wewnętrzne

Typy sparametryzowane

Pakiety i interfejsy. Tomasz Borzyszkowski

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

Mechanizm dziedziczenia

Wykład 7: Pakiety i Interfejsy

Programowanie obiektowe

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

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

Wprowadzenie do programowanie obiektowego w języku C++

Programowanie obiektowe

Dziedziczenie jednobazowe, poliformizm

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Enkapsulacja, dziedziczenie, polimorfizm

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Podstawy Programowania semestr drugi. Wykład czternasty

Klasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego kodu bez edycji (i ewentualnego wprowadzania

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

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

C++ - [4-7] Polimorfizm

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie w Internecie. Java

Wykład 6: Dziedziczenie

Język Java część 2 (przykładowa aplikacja)

Kurs WWW. Paweł Rajba.

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

Programowanie obiektowe

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Programowanie obiektowe

Dziedziczenie i interfejsy

Programowanie obiektowe - 1.

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

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

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

1 Atrybuty i metody klasowe

Dziedziczenie. Ogólna postać dziedziczenia klas:

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

TEMAT : KLASY POLIMORFIZM

Język Java część 2 (przykładowa aplikacja)

PROE wykład 4 pozostałe operatory, forward declaration, dziedziczenie. dr inż. Jacek Naruniec

Programowanie komputerowe. Zajęcia 7

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

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

dr inż. Jarosław Forenc

Programowanie obiektowe. Wykład 03. Maciej Wołoszyn 17 marca Polimorfizm oraz wczesne i późne wiazanie

Podstawy Języka Java

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

Podstawy Programowania Obiektowego

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

.NET Klasy, obiekty. ciąg dalszy

Podstawy programowania III

Programowanie obiektowe

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Materiały do zajęć VII

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

Języki programowania imperatywnego

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

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

Transkrypt:

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Klasa abstrakcyjna Autor: Marcin Orchel Klasa abstrakcyjna to taka, że nie możemy tworzyć obiektów tej klasy, możemy jednak dziedziczyć po tej klasie. Jeśli klasa ma co najmniej jedna metodę abstrakcyjną, a więc nie zdefiniowaną w tej klasie, to klasa jest abstrakcyjna. W Javie dodaje się wtedy słowo kluczowe abstract przed nazwą klasy. W C++ nie jest konieczne dodawanie tego słowa. W C++ aby danej metody nie definiować należy na końcu deklaracji metody dodać = 0;. Metodami niedefiniowanymi mogą być tylko i wyłącznie metody wirtualne. Co to są za metody będzie przedstawione w późniejszej częsci. Metoda wirtualna, niedefiniowana w klasie nazywa się metodą czysto wirtualną (pure virtual). Dziedziczenie W Javie po jednej klasie może dziedziczyć tylko jedna klasa jednokrotne dziedziczenie. Klasa może implementować wiele interfejsów, interfejsy mogą być dziedziczone między sobą wielokrotnie. Przykład: interace interface1 interace interface2 interace interface3 extends interface1, interface2 class class1 implements interface1, interface2 Dziedziczenie z trzema poziomami Klasa Car -> Fiat -> Punto W przypadku uruchomienia Punto punto; punto.startengine(); Jeśli metoda startengine jest zdefiniowana w klasie Punto to ona zostanie uruchomiona. Jeśli nie jest zdefiniowana w klasie Punto, a jest zdefiniowana w klasie Car i Fiat, to zostanie uruchomiona metoda startengine() z klasy Fiat. W przypadku uruchomienia:

void f(car & car) car.startengine(); Punto punto; f(punto); zostanie uruchomiona metoda startengine() z klasy Car. Jeśli metoda startengine będzie wirtualna w klasie Car to zostanie wywołana metoda startengine() z klasy Punto. Jeśli nie jest zdefiniowana w klasie Punto to z klasy Fiat. Metody wirtualne W Javie wszystkie metody są wirtualne. Metoda wirtualna to taka metoda, że mając daną zmienną typu bazowego, pod którą znajduje się obiekt typu pochodnego, wywołanie metody wirtualnej na tej zmiennej spowoduje wywołanie metody z klasy pochodnej, a nie klasy bazowej. W C++ aby metoda była wirtualna musi mieć słowo kluczowe virtual przed nazwą. Przykład: Vehicle public: virtual startengine() ; Tram : public Vehicle public: startengine() ; movevehicles(vehicle & vehicle) vehicle.startengine(); void main() Tram tram = new Tram() movevehicles(tram);

Wywołanie movevehicles(tram) spowoduje uruchomienie metody startengine() z klasy Tram, a nie z klasy Vehicle. Wielokrotne dziedziczenie W Javie jest możliwe tylko jednokrotne dziedziczenie pomiędzy klasami. W C++ jest możliwe wielokrotne dziedziczenie. Przykład Mamy różne rodzaje pojazdów i różne rodzaje silników. Chcemy mieć możliwość definiowania zachowania dla poszczególnych rodzajów pojazdów z poszczególnymi rodzajami silników. Struktura klas: Car -> Fiat Car -> CarWithGasoline Fiat, CarWithGasoline -> FiatWithGasoline Klasy tworzą tzw. strukturę diamentową. Metoda startengine() jest zdefiniowana dla klasy Car, Fiat oraz CarWithGasoline. foo(car & car) FiatWithGasoline fiatwithgasoline; foo(fiatwithgasoline); Powyższe wywołanie funkcji foo jest nieprawidłowe, ponieważ klasa Car jest przekazywana dwoma drogami poprzez klasę Fiat oraz CarWithGasoline. FiatWithGasoline fiatwithgasoline; (1) fiatwithgasoline.startengine(); Przy tym uruchomieniu pojawi się błąd kompilacji, ponieważ nie można stwierdzić, która metoda ma się uruchomić czy z klasy Fiat, czy z klasy CarWithGasoline. Gdy nie ma zdefiniowanej metody startengine() zarówno dla klasy Fiat jak i CarWithGasoline, to również będzie błąd kompilatora, ponieważ metoda startengine() z klasy Car jest przekazywana dwoma drogami i nie wiadomo, którą wybrać. Podobne problemy do powyższych dotyczą również parametrów klas. Można zapobiec przekazywaniu metod dwoma drogami dziedziczenia używając wirtualnego dziedziczenia specyfikowanego następująco: Fiat : public virtual Car.

Jeśli metoda startengine() nie jest zdefiniowana ani dla klasy Fiat, ani dla klasy CarWithEngine, oraz klasy Fiat i CarWithEngine wirtualnie dziedziczą po klasie Car, uruchomienie (1) jest prawidłowe, ponieważ wszystkie metody klasy Car przekazywane są tylko jedną drogą.

Zadania Zadanie podstawowe - stworzyć klasę Figure, po której dziedziczy klasa Triangle - stworzyć klasę Circle dziedziczącą po klasie Figure. W klasie Figure zadeklarować metodę computeperimeter, zdefiniować tą metodę dla klasy Triangle oraz dla klasy Circle. Utworzyć klasę Figures, która w konstruktorze dostaje tablicę figur. W klasie Figures zdefiniować metodę znajdującą figurę o największym obwodzie. Napisać test poprawności programu. Zadanie dodatkowe 1 - stworzyć dodatkową figurę Rhombus dziedziczącą po Figure, - stworzyć dodatkową figurę Square dziedziczącą po Rhombus Znaleźć figurę o największym obwodzie dla przykładowych figur zapisanych w obiekcie klasy Figures. Napisać test poprawności programu. Zadanie dodatkowe 2 Dla wszystkich figur zdefiniować metody liczące pole, zdefiniować w klasie Figures metodę znajdującą największe pole. Zdefiniować klasy: - FigureWithCircleInside Klasa te posiada konstruktor z parametrami koła znajdującego się wewnątrz figury. Klasa ta posiada metodę liczącą pole koła. - RhombusWithCircleInside Klasa ta posiada konstruktor z parametrami rombu oraz koła wpisanego do rombu. Klasa ta posiada metodę liczącą pole figury. Pole figury z kołem wewnątrz jest równe polu figury bez pola koła. Klasa ta posiada metodę sprawdzającą czy dane koło da się wpisać w dany romb. Zdefiniować dodatkowo następujące dziedziczenia: Figure -> FigureWithCircleInside Rhombus, FigureWithCircleInside -> RhombusWithCircleInside W RhombusWithCircleInside napisać metodę sprawdzającą czy można wpisać dane koło w dany romb.

Stworzyć obiekt typu Figures z przykładowymi figurami zdefiniowanymi powyżej. Znaleźć figurę o największym polu. Napisać test poprawności programu.