CodeGym /Java blog /Tilfældig /Standardmetoder i grænseflader
John Squirrels
Niveau
San Francisco

Standardmetoder i grænseflader

Udgivet i gruppen
Hver ny version af Java adskiller sig fra dem, der kom før. Her er et eksempel på ændringer i materiale, som vi har dækket: før Java 5 havde sproget ikke enums. Standardmetoder i grænseflader - 1På samme måde adskiller Java 8 sig markant fra Java 7. De fleste af vores lektioner blev skrevet til den 7. version af sproget, men vi vil selvfølgelig ikke ignorere vigtige innovationer. Da vi allerede taler om grænseflader i denne lektion, vil vi overveje en opdatering - standardmetoder i grænseflader . Du ved allerede, at en grænseflade ikke implementerer adfærd . Dens opgave er at beskrive den adfærd, som alle de objekter, der implementerer den, skal have. Men udviklere stødte ofte på situationer, hvor en metodes implementering er den samme i alle klasser. Lad os overveje vores gamle bileksempel:

public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}
"Hvad er efter din mening hovedproblemet med denne kode? Du har sikkert bemærket, at vi skrev en masse gentagne koder! Dette problem er almindeligt i programmering, og du skal undgå det. Det er en anden sag, at bestemte løsninger ikke eksisterede før Java 8 blev frigivet. Med denne version kom muligheden for at specificere standardmetoder og implementere dem direkte i grænsefladen! Sådan gør du det:

public interface Car {

   public default void gas() {
       System.out.println("Gas!");
   }

   public default void brake() {
       System.out.println("Brake!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Nu er gas()og brake()metoderne, som var ens for alle biler, blevet flyttet til grænsefladen. Ingen gentaget kode er nødvendig. Desuden er metoderne tilgængelige i hver klasse!

public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
Hvad hvis der er 100 klasser med gas()metoden, men kun 99 af dem har samme adfærd? Ødelægger det alt og gør standardmetoden uegnet til denne situation? Selvfølgelig ikke :) Standardmetoder i grænseflader kan tilsidesættes på samme måde som almindelige.

public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("This car accelerates differently!");
   }

   @Override
   public void brake() {
       System.out.println("This car decelerates differently!");
   }
}
Alle de 99 andre typer biler vil implementere standardmetoden, ogUnusualCarklasse, som er en undtagelse, vil ikke ødelægge det overordnede billede og definerer roligt sin egen adfærd. Multipel nedarvning af grænseflader. Som du allerede ved, understøtter Java ikke multipel nedarvning. Det er der mange grunde til. Vi vil se nærmere på dem i en separat lektion. Andre sprog, såsom C++, understøtter det. Uden multipel nedarvning opstår et alvorligt problem: Et objekt kan have flere forskellige karakteristika og 'adfærd'. Her er et eksempel fra livet: vi er børn for vores forældre, studerende for vores lærere og patienter for vores læger. I livet påtager vi os forskellige roller og opfører os derfor anderledes: selvfølgelig ville vi ikke tale med lærere på samme måde, som vi taler til vores nære venner. Lad os prøve at oversætte dette til kode. Forestil dig, at vi har to klasser: Dam og voliere. Til dammen skal vi bruge vandfugle; til volieren har vi brug for flyvende fugle. For at gøre dette har vi oprettet to basisklasser:FlyingBirdog Waterfowl.

public class Waterfowl {
}

public class FlyingBird {
}
Derfor sender vi fugle, hvis klasser arver, FlyingBirdtil volieren, og vi sender fugle, der arver, Waterfowltil dammen. Det hele virker meget simpelt. Men hvor sender vi en and hen? Den svømmer og flyver. Og vi har ikke multipel arv. Heldigvis understøtter Java flere implementeringer af grænseflader. Selvom en klasse ikke kan arve flere forældre, kan den nemt implementere flere grænseflader! Vores and kan både være en flyvende fugl og en vandfugl :) Vi skal simpelthen lave FlyingBirdog Waterfowlgrænseflader frem for klasser for at opnå det ønskede resultat.

public class Duck implements FlyingBird, Waterfowl {

   // The methods of both interfaces can be easily combined into one class

   @Override
   public void fly() {
       System.out.println("Fly!");
   }

   @Override
   public void swim() {

       System.out.println("Swim!");
   }
}
Derfor bevarer vores program klassernes fleksibilitet, og i kombination med standardmetoder bliver vores evne til at definere objekters adfærd næsten ubegrænset! :)
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION