Polimorfizm - przykłady
/* PolimorfizmPrzyklad1.java */
abstract class Instrument
{
abstract void graj();
}
class Beben extends Instrument
{
void graj()
{
System.out.println("bum-bum-bum!");
}
}
class Fortepian extends Instrument
{
void graj()
{
System.out.println("plim-plim-plim!");
}
}
// poźniej zdefiniowano jeszcze jeden instrument
class Trabka extends Instrument
{
void graj()
{
System.out.println("tra-ta-ta!");
}
}
class Orkiestra
{
int liczbaInstrumentow;
Instrument[] instrumenty = new Instrument[10];
public void dodaj(Instrument instrument)
{
instrumenty[liczbaInstrumentow] = instrument;
liczbaInstrumentow++;
}
public void graj()
{
System.out.println("Orkiestra zaczyna grac.");
if (liczbaInstrumentow > 0)
{
for (int i = 0; i < liczbaInstrumentow; i++)
{
instrumenty[i].graj();
}
}
else
{
System.out.println("Cisza...");
}
System.out.println("Orkiestra skonczyla grac.");
}
}
public class PolimorfizmPrzyklad1
{
public static void main(String[] args)
{
Orkiestra orkiestra = new Orkiestra();
orkiestra.dodaj(new Beben());
orkiestra.dodaj(new Fortepian());
orkiestra.dodaj(new Trabka());
orkiestra.graj();
}
}
Orkiestra zaczyna grac.
bum-bum-bum!
plim-plim-plim!
tra-ta-ta!
Orkiestra skonczyla grac.
Press any key to continue...
/* PolimorfizmPrzyklad2.java */
interface Instrument
{
void graj(); // <=> public abstract void graj();
}
class Beben implements Instrument
{
public void graj()
{
System.out.println("bum-bum-bum!");
}
}
class Fortepian implements Instrument
{
public void graj()
{
System.out.println("plim-plim-plim!");
}
}
// poźniej zdefiniowano jeszcze jeden instrument
class Trabka implements Instrument
{
public void graj()
{
System.out.println("tra-ta-ta!");
}
}
class Orkiestra
{
int liczbaInstrumentow;
Instrument[] instrumenty = new Instrument[10];
public void dodaj(Instrument instrument)
{
instrumenty[liczbaInstrumentow] = instrument;
liczbaInstrumentow++;
}
public void graj()
{
System.out.println("Orkiestra zaczyna grac.");
if (liczbaInstrumentow > 0)
{
for (int i = 0; i < liczbaInstrumentow; i++)
{
instrumenty[i].graj();
}
}
else
{
System.out.println("Cisza...");
}
System.out.println("Orkiestra skonczyla grac.");
}
}
public class PolimorfizmPrzyklad2
{
public static void main(String[] args)
{
Orkiestra orkiestra = new Orkiestra();
orkiestra.dodaj(new Beben());
orkiestra.dodaj(new Fortepian());
orkiestra.dodaj(new Trabka());
orkiestra.graj();
}
}
Orkiestra zaczyna grac.
bum-bum-bum!
plim-plim-plim!
tra-ta-ta!
Orkiestra skonczyla grac.
Press any key to continue...
/* Odleglosci.java */
class Punkt
{
int x;
int y;
private static Metryka m = new Euklides(); // metryka domyślna
Punkt(int x, int y)
{
this.x = x;
this.y = y;
}
double odleglosc(Punkt pt)
{
return m.odleglosc(this, pt);
}
public String toString() // przesłaniamy metodę z klasy Object
{
return "(" + x + "," + y + ")";
}
void wypiszOdleglosc(Punkt pt)
{
System.out.println("Metryka " + m);
System.out.println("d(" + this + "," + pt + ") = " + this.odleglosc(pt));
}
static void ustawMetryke(Metryka m)
{
Punkt.m = m;
}
}
abstract class Metryka
{
abstract double odleglosc(Punkt pt1, Punkt pt2);
public String toString() // przesłaniamy metodę z klasy Object
{
return getClass().getName(); // <=> return this.getClass().getName();
}
}
class Euklides extends Metryka
{
double odleglosc(Punkt pt1, Punkt pt2)
{
return Math.sqrt((pt1.x-pt2.x)*(pt1.y-pt2.y) + (pt1.y-pt2.y)*(pt1.y-pt2.y));
}
}
class Taxi extends Metryka
{
double odleglosc(Punkt pt1, Punkt pt2)
{
return Math.abs(pt1.x - pt2.x) + Math.abs(pt1.y - pt2.y);
}
}
class Max extends Metryka
{
double odleglosc(Punkt pt1, Punkt pt2)
{
return Math.max(Math.abs(pt1.x - pt2.x), Math.abs(pt1.y - pt2.y));
}
}
class Min extends Metryka
{
double odleglosc(Punkt pt1, Punkt pt2)
{
return Math.min(Math.abs(pt1.x - pt2.x), Math.abs(pt1.y - pt2.y));
}
}
public class Odleglosci
{
public static void main(String[] args)
{
Punkt a = new Punkt(1,1);
Punkt b = new Punkt(3,2);
a.wypiszOdleglosc(b);
Punkt.ustawMetryke(new Taxi());
a.wypiszOdleglosc(b);
Punkt.ustawMetryke(new Max());
a.wypiszOdleglosc(b);
Punkt.ustawMetryke(new Min());
a.wypiszOdleglosc(b);
}
}
Metryka Euklides
d((1,1),(3,2)) = 1.732050807568877
Metryka Taxi
d((1,1),(3,2)) = 3.0
Metryka Max
d((1,1),(3,2)) = 2.0
Metryka Min
d((1,1),(3,2)) = 1.0
Press any key to continue...
/* Rownania.java */
abstract class Rownanie
{
double[] wsp;
Rownanie(double[] wsp)
{
this.wsp = wsp;
}
void rozwiaz()
{
System.out.println("rown: " + this);
}
public String toString() // przesłaniamy metodę z klasy Object
{
String rownanie = "";
if (wsp[0] != 0) rownanie = "" + wsp[0];
for (int i = 1; i < wsp.length; i++)
{
if (wsp[i] != 0)
{
rownanie += rownanie.equals("") ? "" : " + ";
rownanie += wsp[i] + (i == 1 ? "x" : "x^" + i);
}
}
return rownanie + (rownanie.equals("") ? "0 = 0" : " = 0");
}
}
class RownanieLiniowe extends Rownanie
{
RownanieLiniowe(double a0, double a1)
{
super(new double[] {a0,a1});
}
void rozwiaz()
{
super.rozwiaz();
double b = wsp[0];
double a = wsp[1];
System.out.print("rozw: ");
if (a == 0 && b == 0) System.out.println("x nalezy do R");
if (a == 0 && b != 0) System.out.println("brak rozwiazania");
if (a != 0) System.out.println("x = " + -b/a);
}
}
class RownanieKwadratowe extends Rownanie
{
RownanieKwadratowe(double a0, double a1, double a2)
{
super(new double[] {a0,a1,a2});
}
void rozwiaz()
{
double c = wsp[0];
double b = wsp[1];
double a = wsp[2];
if (a == 0)
{
new RownanieLiniowe(c,b).rozwiaz();
}
else
{
super.rozwiaz();
System.out.print("rozw: ");
double delta = b*b-4*a*c;
if (delta >= 0)
{
double x1 = (-b - Math.sqrt(delta))/(2*a);
double x2 = (-b + Math.sqrt(delta))/(2*a);
System.out.println("x1 = " + x1 + ", x2 = " + x2);
}
else
{
System.out.println("brak rozwiazania");
}
}
}
}
public class Rownania
{
public static void main(String[] args)
{
Rownanie r1 = new RownanieLiniowe(1, 2);
Rownanie r2 = new RownanieKwadratowe(1, 2, -3);
r1.rozwiaz();
r2.rozwiaz();
}
}
rown: 1.0 + 2.0x = 0
rozw: x = -0.5
rown: 1.0 + 2.0x + -3.0x^2 = 0
rozw: x1 = 1.0, x2 = -0.3333333333333333
Press any key to continue...
/* SortowaniePunktow.java */
import java.util.*;
class Punkt implements Comparable
{
int x;
int y;
Punkt(int x, int y)
{
this.x = x;
this.y = y;
}
public int compareTo(Object ob) // implementujemy metodę interfejsu
{
Punkt srodek = new Punkt(0,0);
double d1 = srodek.odleglosc(this);
double d2 = srodek.odleglosc((Punkt)ob);
return d1 < d2 ? -1 : d1 == d2 ? 0 : 1;
}
public String toString() // przesłaniamy metodę z klasy Object
{
return "(" + x + "," + y + ")";
}
double odleglosc(Punkt pt)
{
return Math.sqrt( (x - pt.x)*(x - pt.x) + (y - pt.y)*(y - pt.y) );
}
}
public class SortowaniePunktow
{
public static void main(String[] args)
{
Punkt[] pt = {new Punkt(3,3), new Punkt(1,1), new Punkt(3,2), new Punkt(1,2)};
for (int i = 0; i < pt.length; i++) System.out.print(pt[i] + " ");
System.out.println();
Arrays.sort(pt);
for (int i = 0; i < pt.length; i++) System.out.print(pt[i] + " ");
System.out.println();
}
}
(3,3) (1,1) (3,2) (1,2)
(1,1) (1,2) (3,2) (3,3)
Press any key to continue...