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.
Zadanie domowe! Napisz klasę Facet :) Podziel się nią w komentarzu! Koniecznie napisz ją tak aby facet reagował jakoś na wdzięk Kobiet :)
Mateusz Mazurek