Commit 6f3ec09d by Patryk Czarnik

przykład bilet - rozwiązania poprawne

parent 5c0c8fea
...@@ -6,13 +6,29 @@ public class KasaBiletowa { ...@@ -6,13 +6,29 @@ public class KasaBiletowa {
return 100; return 100;
} }
// To jest złe podejście. Uzależnianie logiki od typu parametru jest zdradliwe.
public int cenaBiletu(Student klient) {
return 50;
}
public static void main(String[] args) { public static void main(String[] args) {
Osoba o = new Osoba(); Osoba o = new Osoba();
Student s = new Student(); Student s = new Student();
KasaBiletowa k = new KasaBiletowa(); KasaBiletowa k = new KasaBiletowa();
// Gdy zmienne są różnych typów, to wszystko OK
System.out.println("Bilet dla " + o + " kosztuje " + k.cenaBiletu(o)); System.out.println("Bilet dla " + o + " kosztuje " + k.cenaBiletu(o));
System.out.println("Bilet dla " + s + " kosztuje " + k.cenaBiletu(s)); System.out.println("Bilet dla " + s + " kosztuje " + k.cenaBiletu(s));
System.out.println();
// Jeśli jednak obiekt Student trafi do zmiennej typu Osoba,
// to podczas wywołania dobrana zostanie metoda z parametrem Osoba,
// Overloading działa w czasie kompilacji i pod uwagę są brane zadeklarowane typy zmiennych,
// a nie faktyczna klasa obiektu w pamięci.
Osoba[] kolejka = {o, s};
for(Osoba klient : kolejka) {
System.out.println("Bilet dla " + klient + " kosztuje " + k.cenaBiletu(klient));
}
} }
......
package p12_klasy_technicznie.bilet_v2;
public class KasaBiletowa {
public int cenaBiletu(Osoba klient) {
if(klient.ulga()) {
return 50;
} else {
return 100;
}
}
public static void main(String[] args) {
Osoba o = new Osoba();
Student s = new Student();
KasaBiletowa k = new KasaBiletowa();
// Gdy zmienne są różnych typów, to wszystko OK
System.out.println("Bilet dla " + o + " kosztuje " + k.cenaBiletu(o));
System.out.println("Bilet dla " + s + " kosztuje " + k.cenaBiletu(s));
System.out.println();
// Jeśli jednak obiekt Student trafi do zmiennej typu Osoba,
// to podczas wywołania dobrana zostanie metoda z parametrem Osoba,
// Overloading działa w czasie kompilacji i pod uwagę są brane zadeklarowane typy zmiennych,
// a nie faktyczna klasa obiektu w pamięci.
Osoba[] kolejka = {o, s};
for(Osoba klient : kolejka) {
System.out.println("Bilet dla " + klient + " kosztuje " + k.cenaBiletu(klient));
}
}
}
package p12_klasy_technicznie.bilet_v2;
public class Osoba {
@Override
public String toString() {
return this.getClass().getSimpleName();
}
boolean ulga() {
return false;
}
}
package p12_klasy_technicznie.bilet_v2;
public class Student extends Osoba {
@Override
boolean ulga() {
return true;
}
}
package p12_klasy_technicznie.bilet_v3;
public class KasaBiletowa {
public int cenaBiletu(Osoba klient) {
if(klient instanceof Student) {
return 50;
} else {
return 100;
}
}
public static void main(String[] args) {
Osoba o = new Osoba();
Student s = new Student();
KasaBiletowa k = new KasaBiletowa();
// Gdy zmienne są różnych typów, to wszystko OK
System.out.println("Bilet dla " + o + " kosztuje " + k.cenaBiletu(o));
System.out.println("Bilet dla " + s + " kosztuje " + k.cenaBiletu(s));
System.out.println();
// Jeśli jednak obiekt Student trafi do zmiennej typu Osoba,
// to podczas wywołania dobrana zostanie metoda z parametrem Osoba,
// Overloading działa w czasie kompilacji i pod uwagę są brane zadeklarowane typy zmiennych,
// a nie faktyczna klasa obiektu w pamięci.
Osoba[] kolejka = {o, s};
for(Osoba klient : kolejka) {
System.out.println("Bilet dla " + klient + " kosztuje " + k.cenaBiletu(klient));
}
}
}
package p12_klasy_technicznie.bilet_v3;
public class Osoba {
@Override
public String toString() {
return this.getClass().getSimpleName();
}
}
package p12_klasy_technicznie.bilet_v3;
public class Student extends Osoba {
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment