CodeGym /Java blogg /Slumpmässig /Relationer mellan klasser. Arv, sammansättning och aggreg...
John Squirrels
Nivå
San Francisco

Relationer mellan klasser. Arv, sammansättning och aggregering

Publicerad i gruppen
Hej! Idag ska vi titta närmare på en princip för objektorienterad programmering (OOP): Arv. Vi kommer också att studera andra typer av samband mellan klasser: sammansättning och aggregering. Relationer mellan klasser.  Arv, sammansättning och aggregering - 1Det här ämnet kommer inte att vara svårt: du har redan stött på arv och exempel på arv många gånger under tidigare lektioner. Idag kommer det viktigaste att vara att förstärka din kunskap, undersöka arvsmekanismen mer i detalj och återigen gå igenom några exempel. :) Nåväl, låt oss gå!

Arv i Java och dess fördelar

Som du säkert kommer ihåg är arv en mekanism som låter dig beskriva en ny klass baserat på en befintlig klass (förälderklass). Genom att göra det lånar den nya klassen egenskaperna och funktionerna för den överordnade klassen. Låt oss komma ihåg ett exempel på arv som gavs i tidigare lektioner:

public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       // Gas
   }

   	public void brake() {
       // Brake
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Vi har ett visst program som går ut på att jobba med olika typer av bilar. Även om du inte är en bilentusiast vet du förmodligen att det finns väldigt många typer av bilar i världen. :) Följaktligen kommer vi att separera bilarnas gemensamma egenskaper i en gemensam överordnad klass som kallas Car. Så vad är gemensamt för alla bilar, oavsett typ? Varje bil har ett tillverkningsår, modellnamn och maxhastighet. Vi lägger in dessa egenskaper i fälten model, maxSpeed, och . yearOfManufactureNär det gäller beteende kan vilken bil som helst accelerera och sakta ner. :) Vi definierar detta beteende i gas()ochbrake()metoder. Vilka fördelar ger detta oss? Först och främst minskar det mängden kod. Självklart klarar vi oss utan föräldraklassen. Men eftersom varje bil måste kunna accelerera och sakta ner, måste vi skapa gas()och brake()metoder i klasserna Truck, Sedan, F1Car, och SportsCari varannan bilklass. Föreställ dig hur mycket extra kod vi skulle behöva skriva. Och glöm inte fälten , , modeloch maxSpeed: yearOfManufactureom vi blir av med föräldraklassen måste vi skapa dem i varje bilklass! Relationer mellan klasser.  Arv, sammansättning och aggregering - 2När vi har ett par dussin bilklasser blir mängden duplikatkod riktigt allvarlig. Genom att flytta vanliga fält och metoder (även kallade "tillstånd" och "beteenden") till en föräldraklass kan vi spara mycket tid och utrymme. Om någon typ har unika egenskaper eller metoder som andra biltyper inte har, ingen stor sak. Du kan alltid skapa dem i en efterkommande klass, separat från alla andra.

public class F1Car extends Car {

   public void pitStop() {

       // Only race cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Låt oss titta på Formel 1-racerbilar som ett exempel. Till skillnad från sina "släktingar" har de ett unikt beteende - de tar ett pitstop då och då. Det här stör oss inte. Vi har redan beskrivit det vanliga beteendet i den Caröverordnade klassen, och det specifika beteendet för underliggande klasser kan läggas till dessa klasser. Relationer mellan klasser.  Arv, sammansättning och aggregering - 3Detsamma gäller för fält: om en barnklass har unika egenskaper deklarerar vi lugnt dessa fält i barnklassen och slutar oroa oss. :) Möjligheten att återanvända kod är den största fördelen med arv. För programmerare är det mycket viktigt att inte skriva extra kod. Du kommer att stöta på detta upprepade gånger i ditt arbete. Kom ihåg något annat viktigt: Java har inte flera arv. Varje klass ärver endast en klass. Vi kommer att prata mer om orsakerna till detta i kommande lektioner. För nu, kom bara ihåg det. Detta gör förresten att Java skiljer sig från vissa andra OOP-språk. Till exempel stöder C++ multipelt arv. Allt är mer eller mindre klart med arv. Låt oss gå vidare.

Sammansättning och aggregering

Klasser och objekt kan länkas samman. Arv beskriver ett "är-ett"-förhållande. Ett lejon är ett djur. En sådan relation uttrycks lätt med hjälp av arv, var Animalär föräldraklassen och Lionär barnet. Men alla relationer beskrivs inte på detta sätt. Till exempel är ett tangentbord definitivt relaterat till en dator, men det är inte en dator . Händer är på något sätt relaterade till en person, men de är inte en person. I dessa fall har vi en annan typ av relation: inte "är-en", utan "har-en". En hand är inte en person, utan är en del av en person. Ett tangentbord är inte en dator, utan är en del av en dator. En has-a relation kan beskrivas i kod med hjälp av komposition och aggregering. Skillnaden ligger i förhållandets "stränghet". Låt oss ge ett enkelt exempel: Vi har en Carklass. Varje bil har en motor. Dessutom har varje bil passagerare. Vad är den grundläggande skillnaden mellan Engine engineoch Passenger[] passengersfälten? Det faktum att passagerare Asitter i en bil betyder inte att passagerare Boch Cinte är i bilen. En bil kan motsvara flera passagerare. Dessutom kommer den att fungera smidigt om alla passagerare går ur en bil. Relationen mellan Carklassen och Passenger[] passengersarrayen är mindre strikt. Det kallas aggregering . Det ger ett annat bra exempel på aggregering. Anta att vi har en Studentklass och enStudentGroupklass. En student kan gå med i flera studentorganisationer: en fysikklubb, en Star Wars-fanklubb och/eller en studentkomediklubb. Komposition är en strängare sorts relation. När man använder komposition är ett objekt en del av något objekt och kan inte tillhöra ett annat objekt av samma typ. Det enklaste exemplet är en bilmotor. En motor är en del av en bil och kan inte vara en del av en annan bil. Som du kan se är deras förhållande mycket striktare än förhållandet mellan Caroch Passengers. Relationer mellan klasser.  Arv, sammansättning och aggregering - 4
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION