Ok.. Pamiętacie naszą klasę człowiek. Mieliśmy kilka metod i pół i to działało. Jedna co się stanie jesli ja bym chciał np.. Podać wymiary ważne tylko dla Kobiety? Np długość nóg? Albo.. Chociażbym znane wszystkim 90-60-90 (biust-talia-biodra). Cięzko by to się implementowało, bo co wtedy przpisać do faceta? W tym momencie zrezygnujemy z rozwiązania ostatniego parametru który determinował płeć. Klasa wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | public class Czlowiek { private String imie; private String naziwsko; public double wiek; public double wzrost; public String kolor_wlosow; private String czynnosc; public Czlowiek(String im, String naz, double wiekk, double wzrostt, String wlosy){ imie =im; naziwsko=naz; wiek=wiekk; wzrost = wzrostt; kolor_wlosow=wlosy; } public void idzSpac(){ czynnosc="spię"; } public boolean ustawCzynnosc(String cz){ czynnosc=cz; return true; } public void idzDoPracy(){ czynnosc="Jezu, znów praca."; } public void idzDoLozka(){ czynnosc="Poleże, odpocznę.."; } public void idzDoLozka(Czlowiek inny){ czynnosc="UWAGA +18 !!! :)"; inny.ustawCzynnosc("UWAGA +18 !!! :)"); } public String getImie(){ return imie; } public String getCzynnosc(){ return czynnosc; } } |
Więc jak możemy rodzielić Człowieka na Kobietę i Mężczyznę? Wprawdzę teraz jeden z podstawowych mechanizmów programowania obiektowego – dziedziczenie. Na czym to polega? Ano na tym, że tworzy się klasę wykorzystując klasę nadrzędną (w naszym przypadku klasę Człowiek). Co się dostaje? Klasa która dziedziczy przejmuje wszystkie pola i metody które są typu public i protected.
Co daje ogromne możliwości! W klasie zmieńmy wszystkie private na protected.. Zrobione?
Ok, czyli pierw zajmijmy się Kobietą…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package hyhy; import java.util.ArrayList; import java.util.List; /** * * @author Matt */ public class Kobieta extends Czlowiek { private int biust; private int talia; private int biodra; private int dlugosc_nog; public double wdziek; protected List zainteresowania= new ArrayList(); public Kobieta(String im, String naz, double wiekk, double wzrostt, String wlosy){ super(im,naz,wiekk, wzrostt, wlosy); zainteresowania.add("zakupy"); zainteresowania.add("sex"); zainteresowania.add("plotki"); } public void ocen(int b, int t, int bi, int nogi){ this.biodra=bi; this.biust=b; dlugosc_nog=nogi; talia=t; ocenAtrakcyjnosc(); } private void ocenAtrakcyjnosc(){ int tab[] = new int[4]; if(biust >70 && biust <110) tab[0]=10; else tab[0]=0; if(talia>55 && talia<75) tab[1]=10; else tab[1]=0; if(biodra >70 && biodra <105) tab[2]=10; else tab[2]=0; wdziek = tab[0]+tab[1]+tab[2]+dlugosc_nog+wzrost; } } |
Wiesz co tu sie stało? No to patrz. Słowo kluczowe „extends” które pojawiło się przy definicji klasy Kobieta definiuje to że klasa ta będzie dziedziczyć z klasy Człowiek. W konstruktorze jest metoda super(), która nigdzie nie jest zdefiniowana.. Metoda ta WYWOŁUJE KONSTRUKTOR KLASY NADRZĘDZNEJ. Czyli przekazując do niego parametry z konstruktora klasy Kobieta, wywoła się konstruktor klasy Czlowiek na rzecz pol w klasie Kobieta. Hmm, troche chyba za bardzo skompikowałem tę czynność w opisie… Patrz.. W klasie Kobieta masz konstruktor. Przyjmuje on takie same parametry jak konstruktor w klasie Człowiek. Teraz zmienne przekazane do konstruktora przekazujemy metodzie super(), która wywołuje te same czynności do konstruktor klasy Czlowiek – czyli wypełnia pola :)
Dodaliśmy Kobietą „defaultowe” zainteresowania ;) Zaimplenetowaliśmy je jako listę Stringów. O listach napisałem w poprzednim rozdziale. Popatrz dalej. To że klasa ma pola i metody z klasy nadrzednej nie znaczy że nie można ona miec dodatkowych pół i metod. Metod ocen() to zwykły „setter” (tak nazywa się metody które tylko przepisuja wartości do zmiennych). Hm, to jeszcze powiem.. „Gettery” to te metody które tylko zwracają wartość prywatynch/chronionych zmiennych. A wracając do tematu… Dalej mamy metodę która w oparciu o podane wartości „wylicza” wdzięk Kobiety ;) bardzo wyszukanego algorytmu to tutaj nie ma – nie ma sensu by był. Po prostu sprawdzam czy wartości mieszczą się w przedziałach „akceptowanych” :D i oceniam – albo dyszka albo, noo.. Niestety zero. Można to robić „mądrzej” – np dzielić z resztą przez 10 i zapisywać resztę.. Albo to tutaj mało istotne jest. Ok, zrozumiałe to jest, nie? Wróćmy teraz do wywołania naszych klas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | public class Hyhy { /** * @param args the command line arguments */ private static Random rand = new Random(System.currentTimeMillis()); public static void main(String[] args) { List grupa =new ArrayList(); String imiona[] = {"Marcin", "Mateusz","Marek"}; String imie; for(int i=0;i<3;i++){ imie = imiona[rand.nextInt(imiona.length)]; grupa.add(new Czlowiek(imie, "Rejtan", 20, 190, "blond")); } grupa.add(new Kobieta("Natalia", "Wielowatkowa", 19, 173,"dlugie blond")); Iterator iterator = grupa.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next().getImie()); } System.out.println(grupa.get(1).getImie()+" posiada czynnosc: "+grupa.get(1).getCzynnosc()); System.out.println(grupa.get(3).getImie()+" posiada czynnosc: "+grupa.get(3).getCzynnosc()); grupa.get(1).idzDoLozka(grupa.get(3)); System.out.println("Po zainicjowaniu metody idzDoLodzka..."); System.out.println(grupa.get(1).getImie()+" posiada czynnosc: "+grupa.get(1).getCzynnosc()); System.out.println(grupa.get(3).getImie()+" posiada czynnosc: "+grupa.get(3).getCzynnosc()); } } |
Zmieniłem wywołanie konstruktora, czyli usunąłem tę ostatnią zmienną i przy tworzeniu Natalii – zmieniłem Czlowiek na Kobieta. I to działa, kompiluje się poprawnie. Masz jakies zastrzeżenia? Powinieneś mieć ;P Gdzie jest mały POZORNY błąd logiczny? Ano.. Lista osób jest listą obiektów typu Czlowiek. A obiekt Kobieta dodał się do tej listy! Tutaj wazna rzecz – klasy podrzędne są typu swojego o równocześnie typu nadrzędnego. Co jest logiczne.. Kobieta przecież człowiekiem jest ;P chociaż czasem faceci wątpią w to.
Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More
Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More
Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More
Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More