Gyakorlati alapok III.
Interfész + öröklődés
Hála a Java rendszerprogramozóinak, interfész és öröklődés szintúgy egymással szorosan összekapcsolódó fogalmak. Nézzük meg az ezzel kapcsolatos szabályokat:
-
az interfészek örökíthetőek, ekkor az utód interfész örökli az ős interfész összes deklarációját,
-
az utód interfész implementálásakor az ős interfész összes metódusát szintén ki kell dolgoznunk, másként fordítási hibával szembesülünk,
-
míg a Java-nyelvben osztályok esetében csakis egyszeres öröklés lehetséges (1 osztálynak csak 1 őse lehet), az interfészek esetében már bármennyi ős lehet,
-
más vonatkozásban az öröklődési szabályok ugyanazok, mint az osztályoknál.
A példa kedvéért létrehoztunk egy utód interfészt (IKorBovitettTulajdonsagok), amelyet az ős interfészből (IKorTulajdonsagok) származtattunk (extends):
public
interface IKorBovitettTulajdonsagok extends IKorTulajdonsagok{
public void eredmenyKiiras(Object obj);
}
Az utód interfész természetesen örökli az ős interfész összes konstansát és metódusfejét, valamint egyetlen újdonsága egy egyszerű eredménykiírás (eredmenyKiiras(Object obj)). Ezt kötelező kidolgoznunk az összes implementáló osztályban, a mostani esetben a KorTeruletOsszegzo és a KorTeruletAtlagolo osztályokban, persze ha már bennük az utód interfészt implementáltuk:
-
public class KorTeruletOsszegzo implements IKorBovitettTulajdonsagok
-
public class KorTeruletAtlagolo implements IKorBovitettTulajdonsagok
Az új, implementált metódust az osztályok konstruktoraiban hívjuk meg; voltaképpen a System.out.println() metódust cseréljük le vele:
KorTeruletOsszegzo(){
eredmenyKiiras(osszegzo());
};
KorTeruletAtlagolo(){
eredmenyKiiras(atlagolo());
};
Nézzük meg a módosított, kibővített, futtatható Java-kódot:
import
java.math.*;
public interface IKorTulajdonsagok {
double PI = Math.PI;
int korSzam = 10;
double korTerulet(int sugar, double PI);
}
public interface IKorBovitettTulajdonsagok extends IKorTulajdonsagok{
public void eredmenyKiiras(Object obj);
}
public class KorTeruletOsszegzo implements IKorBovitettTulajdonsagok{
KorTeruletOsszegzo(){
eredmenyKiiras(osszegzo());
};
@Override
public double korTerulet(int sugar, double PI){
return (sugar * sugar) * PI;
}
public double osszegzo(){
double korTeruletOsszeg = 0;
for(int i = 1; i <= korSzam; i++){
int sugar = i;
korTeruletOsszeg += korTerulet(sugar,
PI);
System.out.println(sugar + " egység
sugarú kör területe: " + korTerulet(sugar, PI));
}
System.out.print("Körterületek összege: " + korTeruletOsszeg);
return korTeruletOsszeg;
}
@Override
public void eredmenyKiiras(Object obj) {
System.out.println(obj);
}
}
public class KorTeruletAtlagolo implements IKorBovitettTulajdonsagok{
KorTeruletAtlagolo(){
eredmenyKiiras(atlagolo());
};
@Override
public double korTerulet(int sugar, double PI){
return (sugar * sugar) * PI;
}
public double atlagolo(){
double korTeruletOsszeg = 0;
for(int i = 1; i <= korSzam; i++){
int sugar = i;
korTeruletOsszeg += korTerulet(sugar,
PI);
System.out.println(sugar + " egység
sugarú kör területe: " + korTerulet(sugar, PI));
}
System.out.print("Körterületek átlaga: " + korTeruletOsszeg /
korSzam);
return korTeruletOsszeg / korSzam;
}
@Override
public void eredmenyKiiras(Object obj) {
System.out.println(obj);
}
}
public class Main {
public static void main(String[] args) {
new KorTeruletOsszegzo();
System.out.println();
new KorTeruletAtlagolo();
}
}
Végeredmény:
1 egység sugarú kör területe: 3.141592653589793
2 egység sugarú kör területe: 12.566370614359172
3 egység sugarú kör területe: 28.274333882308138
4 egység sugarú kör területe: 50.26548245743669
5 egység sugarú kör területe: 78.53981633974483
6 egység sugarú kör területe: 113.09733552923255
7 egység sugarú kör területe: 153.93804002589985
8 egység sugarú kör területe: 201.06192982974676
9 egység sugarú kör területe: 254.46900494077323
10 egység sugarú kör területe: 314.1592653589793
Körterületek összege: 1209.51317163207051209.5131716320705
1 egység sugarú kör területe: 3.141592653589793
2 egység sugarú kör területe: 12.566370614359172
3 egység sugarú kör területe: 28.274333882308138
4 egység sugarú kör területe: 50.26548245743669
5 egység sugarú kör területe: 78.53981633974483
6 egység sugarú kör területe: 113.09733552923255
7 egység sugarú kör területe: 153.93804002589985
8 egység sugarú kör területe: 201.06192982974676
9 egység sugarú kör területe: 254.46900494077323
10 egység sugarú kör területe: 314.1592653589793
Körterületek átlaga: 120.95131716320705120.95131716320705