Mateusz Mazurek – programista z pasją

Python, architektura, ciekawostki ze świata IT

Programowanie

kursJavy.czesc(2);

Cześć! Cieszę się, że mnie odwiedziłeś/aś. Zanim przejdziesz do artykułu chciałbym zwrocić Ci uwagę na to, że ten artykuł był pisany kilka lat temu (2013-01-26) miej więc proszę na uwadzę że rozwiązania i przemyślenia które tu znajdziesz nie muszą być aktualne. Niemniej jednak zachęcam do przeczytania.

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 :)

Przejdź do części 3..

Dzięki za wizytę,
Mateusz Mazurek

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

1 Komentarz
Inline Feedbacks
View all comments