Citat:
Ursprungligen postat av wooten
Vad är egentligen interface bra för? Om en viss klass implementerar ett interface, måste ju ändå metoderna skrivas i denna klass. Är det bara ett sätt att se vilka metoder som bör finnas i klassen? Jag menar, om en klass implementerar ett interface och när programmet (eller klassen) kompilerar så bestämmer man sig för att deleta interfacet kommer ju programmet fortfarande att bli oförändrat. Interfacet "gör" ju ingenting egentligen förutom att rabbla upp en massa metoder som ändå måste definieras i klassen som implementerar interfacet...
Ändra "bör" till "ska". Ett interface definierar ett kontrakt som de klasser som implementerar det måste uppfylla. Och du kanske inte är helt rätt ute med att det bara är att deleta interfacet hur som helst. Ta ett exempel:
Kod:
public interface Shape {
double calculateArea();
}
public class Square implements Shape {
private double size;
public Square(double size) {
this.size = size;
}
public double calculateArea() {
return (size * size);
}
}
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double calculateArea() {
return (Math.PI * radius * radius);
}
}
public class ShapeTest {
public static void main(String[] args) {
Shape s1 = new Square(5.0);
Shape s2 = new Circle(10.0);
System.out.println("Total area = " + calculateTotalArea(s1, s2));
}
public static double calculateTotalArea(Shape...shapes) {
double sum = 0;
for (Shape shape : shapes) {
sum += shape.calculateArea();
}
return sum;
}
}
I det här fallet definieras kontraktet av interfacet Shape och andra delar av programmet (metoden calculateTotalArea i ShapeTest) kodas mot interfacet istället för mot respektive konkret implementation av Shape. På så sätt låser man inte in sig mot en specifik implementation (Square eller Circle) och kan lägga till nya implementationer som t.ex. Triangle, Rectangle eller Ellipse utan att programmet (ShapeTest) behöver ändras.
Sen är det väl egentligen en avvägningsfråga om Shape ska vara ett interface eller en abstrakt klass med den abstrakta metoden "double calculateArea()". Hade det varit ett fall där alla konkreta implementationer till viss eller stor del innehåller samma saker hade det kanske varit en bättre idé att köra på en abstrakt basklass istället för att slippa skriva om samma kod.