static void Main(string[] args) { Prostokat prostokat = new Prostokat(1, 2); Prostopadloscian prostopadloscian = new Prostopadloscian(3, 4, 5); Prostokat[] prostokaty = { new Prostokat(4, 5), new Prostokat(3, 4), new Prostopadloscian(2, 4,5), new Prostopadloscian(4, 5, 5) }; // POLIMORFIZM // Do klas Prostokat i Prostopadloscian dodajmy metode // void wypisz() // ktora wypisze dane obiektu (zobacz metody w klasach) prostokat.wypisz(); prostopadloscian.wypisz(); // dzialanie programu jest na razie zgodne z oczekiwaniami. // Sprawdzmy teraz co zostanie wypisane dla tablicy prostokaty_wsk // zawierajacej 2 prostokaty i 2 prostopadlosciany. for (int i = 0; i < 4; i++) { Console.Write("figura nr " + i + " to "); prostokaty[i].wypisz(); } Console.WriteLine(); // Temu "problemowi" możemy zaradzić przez funkcje wirtualne // (zobacz metode void wypisz2() w klasach) for (int i = 0; i < 4; i++) { Console.Write("figura nr " + i + " to "); prostokaty[i].wypisz2(); } Console.WriteLine(); Console.WriteLine(); // KLASY ABSTRAKCYJNE // definicje tych klas znajduja sie w pliku Figury.h Figura[] tablica = { new Kolo(10), new Kwadrat(10), }; foreach (var figura in tablica) { Console.WriteLine("pole = " + figura.obliczPole()); Console.WriteLine("obwod = " + figura.obliczObwod()); Console.WriteLine(); } }
static void Main(string[] args) { Prostokat prostokat = new Prostokat(5, 6); prostokat.obliczObwod(); prostokat.obliczPole(); Prostopadloscian prostopadloscian = new Prostopadloscian(10, 20, 40); prostopadloscian.obliczPole(); prostopadloscian.obliczObwod(); prostopadloscian.obliczObjetosc(); // W funkcji ktora wymaga obiektu klasy Prostokat, mozemy podac prostokat lub prostopadloscian, // poniewaz prostopadloscian dziedziczy po prostokacie wiec ma wszystkie jego wlasciwosci. // Zachodzi tutaj "object slicing" - Prostopadlosc jest "przycinany" do rozmiarow "prostokata": Console.WriteLine("wieksze pole ma figura nr " + porownajPola(prostokat, prostopadloscian)); // Inny przykład "object slicing". Próba przypisania: Prostopadloscian -> Prostokat -> Prostopadloscian Prostokat p2 = prostopadloscian; // mozemy rzutować "w dół" //Prostopadloscian pp2 = p2; // ale nie możemy "w górę" // Tworząc tablice Prostokatow, mozemy podawac Prostokaty i Prostopadlosciany, Prostokat[] prostokaty = { new Prostokat(4, 5), new Prostokat(3, 4), new Prostopadloscian(2, 4,5), new Prostopadloscian(4, 5, 5) }; for (int i = 0; i < 4; i++) { Console.WriteLine("figura nr " + i); Console.WriteLine("Obwod = " + prostokaty[i].obliczObwod()); Console.WriteLine("Pole = " + prostokaty[i].obliczPole()); Console.WriteLine(); } // Elementy tablicy prostokaty[] są typu Prostokat, nie Prostopoadloscian // więc nie możemy zawołać metody obliczObjetosc() //prostokaty[3].obliczObjetosc(); // ale my wiemy że jest tam rzeczywiscie Prostopadloscian wiec mozemy rzutowac ('castowac') ten typ: ((Prostopadloscian)prostokaty[3]).obliczObjetosc(); // co sie moze stac jesli wszystkie figury potraktujemy jak prostopadlosciany? for (int i = 0; i < 4; i++) { Console.WriteLine("figura nr " + i); Prostopadloscian prosto = (Prostopadloscian)(prostokaty[i]); Console.WriteLine("Obwod = " + prosto.obliczObwod()); Console.WriteLine("Pole = " + prosto.obliczPole()); Console.WriteLine("Objetosc = " + prosto.obliczObjetosc()); Console.WriteLine(); } // zostanie rzucony wyjątek (błąd) System.InvalidCastException // WNIOSEK // rzutować mozemy uzywac TYLKO wtedy kiedy znamy typ obiektu }