230 likes | 360 Views
10 – Interfaces. Abstrakte klasser og interfaces i Java. Indhold. Hvad er en abstrakt metode og en abstrakt klasse? Hvad er et interface? Hvorfor bruge interface? Interface som en type Interface vs. Class Oprette et interface Implementere et interface Implementere flere interface's
E N D
10 – Interfaces Abstrakte klasser og interfaces i Java
Indhold • Hvad er en abstrakt metode og en abstrakt klasse? • Hvad er et interface? • Hvorfor bruge interface? • Interface som en type • Interface vs. Class • Oprette et interface • Implementere et interface • Implementere flere interface's • Arv med interface's • Interface og polymorfi • Overskriv et interface
Abstrakte Metoder • Metoder, der ikke er implementeret (har en body) • For at oprette en abstrakt metode tilføjes abstract og {…} udelades. Der afsluttes med ; public abstractvoidsomeMethod();
Abstraktklasse • En abstract klasseer en klassehar en ellerflereabstraktemetoder. Den erklæres med abstract modifier • En abstrakt klasse kan ikke instanseres • Man kan altså ikke bruge new på en abstrakt klasse • En anden klasse er nødt til at arve fra den abstrakte klasse og implementere metoden
Sample Abstract Class public abstract class LivingThing { public void breath(){ System.out.println("Living Thing breathing..."); } public void eat(){ System.out.println("Living Thing eating..."); } public abstract void walk(); } public class Human extendsLivingThing { public void walk(){ System.out.println("Human walks..."); } }
When to use Abstract Methods &Abstract Class? • Abstraktemetoderbrugesnårdetikke giver mening at implementere den isuperklassen. F.eks area i shape. • Samtidigterdetstadigmuligt at genbruge en del afkoden
Hvader et Interface? • Deterstandardliseretog public måde at beskrive en klassesadfærd, dvs. klassens public medlemmer, altsåklassens interface • Interface definerer en kontrakt • Allemetoderi et interface erabstraktemetoder • En konkretklasseskalimplementereinterfacet, dvs. alle de abstraktemetoder. • Interface giver klasser mulighed for at implementere fælles adfærd uanset placering i klasse hierakiet. Og synliggør det for andre klasser.
Eksempel: Interface Relation public interface Relation { public booleanisGreater( Object a, Object b); public booleanisLess( Object a, Object b); public booleanisEqual( Object a, Object b); }
Eksempel2: OperatorCar Interface public interface OperateCar { // constant declarations, if any // method signatures int turn(Direction direction, double radius, double startSpeed, double endSpeed); intchangeLanes(Direction direction, double startSpeed, double endSpeed); intsignalTurn(Direction direction, booleansignalOn); intgetRadarFront(double distanceToCar, double speedOfCar); intgetRadarRear(double distanceToCar, double speedOfCar); ...... // more method signatures }
Hvorforbruge interfaces? • At synliggøre (en del af) en klasses interface uden at gøreimplementationsynlig. • Dvs. detunderstøtterindkabsling • Implementationenkanændresuden at involvere den derkalderinterfacetsmetoder • Brugerenbehøverikke at den implementerendeklassepåkompileringstidspunktet • Den behøver kun at kendeinterfacetpåkompileringstidspunktet • Deterførstpå runtime at den aktuelleobjektinstansbliverknyttetsammen med interfacet
Hvorforbruge interfaces? • Klasser, derikkehørersammenkan have sammeadfærd / metoderuden at den enearverfra den anden • Eksempel: • KlassenLine ogklassenMyInteger • De erikkerelatereretgennemarv • Men de kanimplementeresamme interface • checkIsGreater(Object x, Object y) • checkIsLess(Object x, Object y) • checkIsEqual(Object x, Object y) • Dervedkandet f.eks væremuligt at sorteredem
Hvorfor bruge interfaces? • Modellere mutibel arv. • En klasse kan implementere flere interfaces, men kun arve fra en klasse
Interface vs. abstraktklasse • Allemetoderi et interface erabstrakte, men at ikkeallemetoderi en abstraktklassebehøver at væreabstrakte. • Et interface kan kun definerekonstanter, men en abstraktklassekan have attributter. • Interfaces erikkearv. De eruafhængige • Men interfaces kan indbyrdes arve fra hinanden
Instance som en type • Når et interface defineres, defineres en ny reference type, på samme måde som med en klasse • Interface navne kan bruges på samme måde som klasse navne • Hvis en variabel er erklæret som en instans af et interface, skal den sættes til et objekt af en klasse, der implementerer interfacet • Hvis Person implementerer PersonInterface: • Person p1 = new Person(); • PersonInterface pi1 = p1; • PersonInterface pi2 = new Person();
Defining Interfaces public interface [InterfaceName] { //some methods without the body }
ImplementereInterfaces • For at oprette en klassederimplementerer et interface, brugesimplementskeyword. public class Line implements Relation { private double x1; private double x2; private double y1; private double y2; public Line(double x1, double x2, double y1, double y2){ this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2; } // More code follows
public double getLength(){ double length = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)* (y2-y1)); return length; } public booleanisGreater( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen > bLen); } public booleanisLess( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen < bLen); } public booleanisEqual( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen == bLen); } }
Implementeringafinterfaces • Følgendeopstårhvisikkealle interface metodererimplementeret • Line.java:4: Line is not abstract and does not override abstract method isGreater(java.lang.Object,java.lang.Object) in Relation • public class Line implements Relation • ^ • 1 error
Eksempel: Implementeremultiple interfaces • Enkonkretklasseextends eensuper klasse, men kanimplementereflereInterfaces: public class ComputerScienceStudentextends Student implements PersonInterface, AnotherInterface, Third interface { // All abstract methods of all interfaces // need to be implemented. }
Interface arv • Interfaces erikke en del afklassehierarkiet • Men de kan alligevel arve fra andre interfaces public interface PersonInterface { void doSomething(); } public interface StudentInterface extends PersonInterface { void doExtraSomething(); }
Interface ogpolymorfi • Interfaces understøtterpolymorfipå den måde at nårprogrammetkalder en interface metode, vil den rigtigemetodeafhængigtaftypenblivekaldt
Omskrivningaf et eksisterende interface • Her er et interface: public interface DoIt { void doSomething(inti, double x); intdoSomethingElse(String s); } • I en senere version skalinterfacetudvides public interface DoIt { void doSomething(inti, double x); intdoSomethingElse(String s); booleandidItWork(inti, double x, String s); } • Hvis man gørdetkan de gamleklasser, derbrugerinterfacetikkelængerebruges
Løsning public interface DoItPlus extends DoIt { booleandidItWork(inti, double x, String s); } • Nu kan de gamleklasserstadigbrugedetgamle interface, mens de nyeklasserimplementererbådedetnyeogdetgamle