När ska jag använda abstrakta klasser och gränssnitt (Interface)? - Java

Permalänk

När ska jag använda abstrakta klasser och gränssnitt (Interface)? - Java

Hej!

Jag håller på att lära mig OOP inom Java och jag har nu kommit till abstrakta klasser och gränssnitt (Interface).
För att jag ska kunna lära mig detta så måste jag associera till något. Då har jag två frågor:

1. Är abstrakta klasser och grännsnitt när jag vill importera metoder och parametrar från en klass, men jag vill endast importera vissa metoder och parametrar från en klass och då använder jag abstrakta klasser och gränssnitt för att importera det jag endast behöver?

2. Är abstrakta klasser och gränssnitt när jag vill ärva olika parametrar och metoder från olika typer utav klasser för Java kan inte ärva mer än en klass. Endast en klass kan ärva igenom nyckelordet extends

Så vad är rätt?
Ni får självklart beskriva ett annat alternativ om både alternativ ett och alternativ 2 är felaktiga.

Permalänk
Medlem

Abstrakta klasser använder du med fördel i scenarion där du vill ha en "moderklass" till dina ärvda klasser, men du vill inte att denna klassen ska kunna instansieras som ett objekt.

Säg du har en abstrakt klass "biltillverkare", som i sin tur har normala subklasser "volvo" och "saab". Du kan instansiera "volvo" och "saab" som objekt. Men "biltillverkare" kan inte instansieras. Dels så funkar din abstrakta klass som en mall, och dels så kan du skapa t.ex. en lista av "biltillverkare" där både "volvo" och "saab" kan lagras eftersom de är subklasser.

Interface är på pappret rätt likt en abstrakt klass, men här snackar vi om att klasser som implementerar ett interface "ingår i ett kontrakt" att de har den funktionalitet som specificeras i interfacet. Interfacet definierar visserligen inte specifikt hur funktionaliteten ska utföras, detta kan skilja från klass till klass, men man säkrar att namn på metoder, returvärdestyper och parametervärdestyper är samma över alla implementerande klasser.

Kan användas i scenarion där du vill kunna klumpa ihop flera oberoende klasstyper baserat på gemensam funktionalitet.

Ett exempel hade kunnat vara i en spelmotor, där du har flera olika klasser för spelare, fiende, npc, statiska objekt men samtliga av dem implementerar t.ex. ett interface för hur de ska renderas på skärmen, och kanske även ett interface för hur de beter sig när de kolliderar med något.

Permalänk
Skrivet av elBenko:

Kan användas i scenarion där du vill kunna klumpa ihop flera oberoende klasstyper baserat på gemensam funktionalitet.

Ett exempel hade kunnat vara i en spelmotor, där du har flera olika klasser för spelare, fiende, npc, statiska objekt men samtliga av dem implementerar t.ex. ett interface för hur de ska renderas på skärmen, och kanske även ett interface för hur de beter sig när de kolliderar med något.

Så om jag har en klass för fiende, Npc och spelare och jag vill kunna använda dessa i en klass så kan jag säga att fiende, Npc, och spelare är abstrakta klasser?

Finns det inget enklare sätt att beskriva abstrakta klasser och gränssnitt? Jag ser att MÅNGA har problem med detta.

Permalänk
Medlem
Skrivet av heretic16:

Så om jag har en klass för fiende, Npc och spelare och jag vill kunna använda dessa i en klass så kan jag säga att fiende, Npc, och spelare är abstrakta klasser?

Finns det inget enklare sätt att beskriva abstrakta klasser och gränssnitt? Jag ser att MÅNGA har problem med detta.

Abstrakt klass: Player

Instanser:

NPC:Player

Human:Player

Enemy:Player

I den abstrakta klassen stoppar du metoder och logik som är gemensam för alla andra typer - så att du bara behöver skriva koda en gång.(jag är C# mupp inte java, men det är samma mönster)

// LZ

Permalänk
Medlem

Du hade kunnat ha en abstrakt basklass döpt "unit", där du definierar fält för position, textur och andra gemensamma egenskaper. Eftersom denna är abstrakt så kan du inte instansiera den och det är precis så vi vill ha det, däremot de ärvande klasserna player, enemy och npc är vanliga klasser och kan därför instansieras, eftersom vi vill kunna skapa objekt av dessa typer.
Tack vare arvet från "unit" så kan du också stoppa alla i en lista eller array av typen "unit". I stället för att behöva ha en separat lista för varje klasstyp.

Kortfattat: En abstrakt klass är precis som en vanlig klass, med undantaget att den inte kan/får instansieras. Den agerar således bara som en "mall" för sina ärvande klasser.

Permalänk
Skrivet av Tea42BBS:

Abstrakt klass: Player

Instanser:

NPC:Player

Human:Player

Enemy:Player

I den abstrakta klassen stoppar du metoder och logik som är gemensam för alla andra typer - så att du bara behöver skriva koda en gång.(jag är C# mupp inte java, men det är samma mönster)

// LZ

Okej.

Så den abstrakta klassen Player kan innehålla metoder och parametrar från klasserna NPC, Human och Enemy? Vart kommer interface in här någonstans då?

Permalänk

Så abstrakta klasser och gränssnitt är att jag skapar en ny klass som jag importerar metoder och parametrar från andra olika klasser?

Permalänk
Medlem

Såhär ser jag det:

Interface:
Detta är extremt abstrakt och definerar ingen implementation

Abstract class:
Lite abstrakt då den kan deklarera metoder både med och utan implementation.

Om man ska förenkla det hela så är syftet att du kan definera hur något ska se ut utan att bstämma hur det faktiskt funkar. Detta gör att du kan ha unika implementationer så länge input och output är detsamma.
Ett bra exempel på interface är Listor. Jag antar att du oftast gör såhär:

ArrayList myList = new ArrayList();

Nu har du en ArrayList instans som fungerar som väntat, du kan kalla på dess metoder. Problemet är nu att om du vid ett senare tillfälle vill byta datatyp t en t ex Hashmap så måste du ändra överallt. (Hint: INTE BRA!) Om du istället hade gjort såhär:

List myList = new ArrayList();

Så kan du enbart använda de metoder som finns i List interfacet. Så nu kan du inte använda ArrayList metoderna längre utan enbart de som finns i List. Detta kan vara till en nackdel om det finns en speciell metod i ArrayList du vill använda. Men däremot kan du nu enkelt byta ut datatypen till vad som helst som implementerar List. Detta eftersom programmet vet hur en List ska se ut. En bra regel är att försöka använda så generella interface du kan då det blir enklare i längden.

Observera att dessa koncept kan skilja sig mellan språk och även inom olika versioner av språket. Nu minna jag inte exakt men de har ändrat en del i interfaces i de senare java versionerna.

Här finns lite mer: https://stackoverflow.com/questions/761194/interface-vs-abstr...

Bra analogi:
For eg. A Car and a Truck share a lot of core properties and behaviour of an Automobile abstract class, but they also share some peripheral behaviour like Generate exhaust which even non automobile classes like Drillers or PowerGenerators share and doesn't necessarily defines a Car or a Truck, so Car, Truck, Driller and PowerGenerator can all share the same interface IExhaust.

Visa signatur

Citera för svar

Permalänk
Skrivet av Baxtex:

Såhär ser jag det:

Abstrakt klass: Fungerar bra när du har en super/parent class som du inte vill instansiera och har viss implementation.

Interface: Fungerar likadant som en abstrakt klass men har ingen implementation alls.

Om man ska förenkla det hela så är syftet att du kan definera hur något ska se ut utan att bstämma hur det faktiskt funkar. Detta gör att du kan ha unika implementationer så länge input och output är detsamma.

Observera att dessa koncept kan skilja sig mellan språk och även inom olika versioner av språket. Nu minna jag inte exakt men de har ändrat en del i interfaces i de senare java versionerna.

Så? Hur ska jag tolka dem som?

Tänk dig att jag har en klass A och klass B, C, D. I klass A så vill jag ärva vissa metoder från B, C, D. Då är...abstrakta klasser eller gränssnitt bra?

Permalänk
Medlem
Skrivet av heretic16:

Okej.

Så den abstrakta klassen Player kan innehålla metoder och parametrar från klasserna NPC, Human och Enemy? Vart kommer interface in här någonstans då?

Ett Interface är ett avtal att klassen som implementerar sagt interface har viss funktionalitet som definieras i interfacet.

Låt säga att du har ett interface kallat "iDrawable" som säger det måste finnas en metod/funktion som heter "Draw()", och att denna metod har returvärdet void och inte har några parametrar.

Då kan du sen loopa över en lista över samtliga objekt som implementerar "iDrawable" och anropa metoden Draw() för varje objekt. Du vet att alla objekt i listan har metoden eftersom interfacet är ett avtal som garanterar det.

Permalänk
Medlem
Skrivet av heretic16:

Så? Hur ska jag tolka dem som?

Tänk dig att jag har en klass A och klass B, C, D. I klass A så vill jag ärva vissa metoder från B, C, D. Då är...abstrakta klasser eller gränssnitt bra?

Java tillåter inte dig att ärva från multipla klasser. Du kan ärva neråt hur mycket du vill, men enbart från en klass.

Permalänk
Skrivet av elBenko:

Ett Interface är ett avtal att klassen som implementerar sagt interface har viss funktionalitet som definieras i interfacet.

Låt säga att du har ett interface kallat "iDrawable" som säger det måste finnas en metod/funktion som heter "Draw()", och att denna metod har returvärdet void och inte har några parametrar.

Då kan du sen loopa över en lista över samtliga objekt som implementerar "iDrawable" och anropa metoden Draw() för varje objekt. Du vet att alla objekt i listan har metoden eftersom interfacet är ett avtal som garanterar det.

Så interface är ett filter för en abstrakt klass?

Permalänk
Medlem
Skrivet av heretic16:

Så interface är ett filter för en abstrakt klass?

Nej.

Kolla denna videon: https://www.youtube.com/watch?v=2aQ9Y7bumts

Visa signatur

Citera för svar

Permalänk

Vi tittar på detta exempel

//Creating interface that has 4 methods interface A{ void a();//bydefault, public and abstract void b(); void c(); void d(); } //Creating abstract class that provides the implementation of one method of A interface abstract class B implements A{ public void c(){System.out.println("I am C");} } //Creating subclass of abstract class, now we need to provide the implementation of rest of the methods class M extends B{ public void a(){System.out.println("I am a");} public void b(){System.out.println("I am b");} public void d(){System.out.println("I am d");} } //Creating a test class that calls the methods of A interface class Test5{ public static void main(String args[]){ A a=new M(); a.a(); a.b(); a.c(); a.d(); }}

Utskrivning:

Citat:

I am a
I am b
I am c
I am d

Så Jag förstår att klass M ärver metoden c() från abstrakta klassen B. Men vad är syftet med interface?

Permalänk
Medlem
Skrivet av heretic16:

Så interface är ett filter för en abstrakt klass?

Nej. Abstrakt klass och Interface är två rätt liknande koncept för två rätt olika användningsområden.

Abstrakt klass använder du när du vill ha en superklass som du inte vill ska kunna instansieras till ett objekt. Den funkar annars precis som en vanlig klass.

Ett Interface är lik en abstrakt klass i det faktum att det inte kan instansieras till ett eget objekt, men till skillnad från en abstrakt klass där de ärvande klasserna automatiskt ärver metoder och fält från superklassen så ser ett Interface till att du (programmeraren) måste implementera vissa metoder i din klass för att få lov att implementera Interfacet. Det är således ett "kontrakt" att klassen uppfyller kraven satta i Interfacet.

I en abstrakt klass kan du koda logik i dina metoder, som de ärvda klasserna kan antingen använda eller ersätta med egen logik - I ett Interface definierar du bara stommen av dina metoder, dvs. namn, returvärdestyp och parametertyper, utan någon som helst logik kådad i interfacet.

Permalänk
Skrivet av elBenko:

Nej. Abstrakt klass och Interface är två rätt liknande koncept för två rätt olika användningsområden.

Abstrakt klass använder du när du vill ha en superklass som du inte vill ska kunna instansieras till ett objekt. Den funkar annars precis som en vanlig klass.

Ett Interface är lik en abstrakt klass i det faktum att det inte kan instansieras till ett eget objekt, men till skillnad från en abstrakt klass där de ärvande klasserna automatiskt ärver metoder och fält från superklassen så ser ett Interface till att du (programmeraren) måste implementera vissa metoder i din klass för att få lov att implementera Interfacet. Det är således ett "kontrakt" att klassen uppfyller kraven satta i Interfacet.

I en abstrakt klass kan du koda logik i dina metoder, som de ärvda klasserna kan antingen använda eller ersätta med egen logik - I ett Interface definierar du bara stommen av dina metoder, dvs. namn, returvärdestyp och parametertyper, utan någon som helst logik kådad i interfacet.

Kan du visa ett enkelt exempel? Ta t.ex. allt i en enda fil. A, B, C fungerar riktigt bra. Tack.

Permalänk
Medlem
Skrivet av heretic16:

Vi tittar på detta exempel

//Creating interface that has 4 methods interface A{ void a();//bydefault, public and abstract void b(); void c(); void d(); } //Creating abstract class that provides the implementation of one method of A interface abstract class B implements A{ public void c(){System.out.println("I am C");} } //Creating subclass of abstract class, now we need to provide the implementation of rest of the methods class M extends B{ public void a(){System.out.println("I am a");} public void b(){System.out.println("I am b");} public void d(){System.out.println("I am d");} } //Creating a test class that calls the methods of A interface class Test5{ public static void main(String args[]){ A a=new M(); a.a(); a.b(); a.c(); a.d(); }}

Utskrivning:

Så Jag förstår att klass M ärver metoden c() från abstrakta klassen B. Men vad är syftet med interface?

Syftet med Interface i denna övningen är att det "tvingar" dig att implementera a() b() c() d(), och eftersom du bara implementerar c() i superklassen så måste resten implementeras i subklassen. Och eftersom superklassen B är abstrakt så kan man bara initiera subklassen M

Permalänk
Medlem

C# exempel, torde vara identiskt med Java.

using System; namespace sweExample { class Program { static void Main(string[] args) { IInterface myInterface = new CommonClass1(); myInterface.Method0(); myInterface.Method1(); myInterface.Method2(); AbstractClass myAbstractClass = new CommonClass2(); myAbstractClass.Method0(); myAbstractClass.Method1(); myAbstractClass.Method2(); Console.ReadKey(); } public interface IInterface { void Method0(); void Method1(); void Method2(); } public abstract class AbstractClass { public void Method0() { Console.WriteLine("Hello abstract world 0"); } public abstract void Method1(); public abstract void Method2(); } public class CommonClass1 : IInterface { public void Method0() { Console.WriteLine("Hello Implemented interface world 0"); } public void Method1() { Console.WriteLine("Hello Implemented interface world 1"); } public void Method2() { Console.WriteLine("Hello Implemented interface world 2"); } } public class CommonClass2 : AbstractClass { public override void Method1() { Console.WriteLine("Hello Implemented abstract world 1"); } public override void Method2() { Console.WriteLine("Hello Implemented abstract world 2"); } } } }

Detta kommer printa:

Hello Implemented interface world 0 Hello Implemented interface world 1 Hello Implemented interface world 2 Hello abstract world 0 Hello Implemented abstract world 1 Hello Implemented abstract world 2

Visa signatur

Citera för svar

Permalänk
Medlem
Skrivet av Baxtex:

C# exempel, torde vara identiskt med Java.

using System; namespace sweExample { class Program { static void Main(string[] args) { IInterface myInterface = new CommonClass1(); myInterface.Method0(); myInterface.Method1(); myInterface.Method2(); AbstractClass myAbstractClass = new CommonClass2(); myAbstractClass.Method0(); myAbstractClass.Method1(); myAbstractClass.Method2(); Console.ReadKey(); } public interface IInterface { void Method0(); void Method1(); void Method2(); } public abstract class AbstractClass { public void Method0() { Console.WriteLine("Hello abstract world 0"); } public abstract void Method1(); public abstract void Method2(); } public class CommonClass1 : IInterface { public void Method0() { Console.WriteLine("Hello Implemented interface world 0"); } public void Method1() { Console.WriteLine("Hello Implemented interface world 1"); } public void Method2() { Console.WriteLine("Hello Implemented interface world 2"); } } public class CommonClass2 : AbstractClass { public override void Method1() { Console.WriteLine("Hello Implemented abstract world 1"); } public override void Method2() { Console.WriteLine("Hello Implemented abstract world 2"); } } } }

Detta kommer printa:

Hello Implemented interface world 0 Hello Implemented interface world 1 Hello Implemented interface world 2 Hello abstract world 0 Hello Implemented abstract world 1 Hello Implemented abstract world 2

litet fel här där myInterface.Method0() borde vara myAbstractClass.Method0() osv

AbstractClass myAbstractClass = new CommonClass2(); myInterface.Method0(); myInterface.Method1(); myInterface.Method2();

Permalänk
Skrivet av elBenko:

Syftet med Interface i denna övningen är att det "tvingar" dig att implementera a() b() c() d(), och eftersom du bara implementerar c() i superklassen så måste resten implementeras i subklassen. Och eftersom superklassen B är abstrakt så kan man bara initiera subklassen M

Jaha! Nu ser jag!

A a=new M();

Trodde det stod hela tiden.

M a=new M();

Okej!!!
Så jag tvingar den abstrakta klassen B att använda voidfuktionerna i gränsnsittet A, trots att dem saknar kod.
Där efter så kommer klass M att ärva funktionen c() från den abstrakta klassen B.

Om jag nu göra ett objekt utav klassen M så kommer gränsnittet A att säga "Du ska implementera a(), b(), c(), d() endast! Skit i allt annat!".

Så det betyder att A styr vilka metoder (och parametar?) som ska genereras från M klassen?
Alltså kan man använda interface + abstract för att kombinera flera olika metoder i en enda klass?

Permalänk
Medlem

@heretic16: Du är på rätt väg.

För att en klass ska få lov att implementera ett Interface, så måste klassen åtminstone implementera det som Interfacet säger.
Interfacet säger dock aldrig hur logiken i metoderna ska se ut. Och klassen kan alltid ha ytterligare egenskaper och funktionalitet utöver kraven från Interfacet.

En annan viktig grej är att en klass dessutom kan implementera multipla Interface. Class A Implements Interface1, Interface2, Interface3 etc.

Varvid när det kommer till abstrakta (eller vanliga) klasser så kan en klass bara ärva från en styck annan klass.

Detta är ett rätt luddigt område, det kan ta tid innan polletten trillar ner. Speciellt innan man förstår i vilka situationer man själv kan/bör använda sig av dessa koncept.

Jag läste något för ett antal år sedan som hjälpte mig lite att förstå skillnaderna.
"A class defines who you are, and an interface tells what roles you could play"

Så om Jimmie Åkesson hade fått beskriva så hade han sagt: Klassen innehåller din nedärvda essens, och Interfacet beskriver vad du kan erbjuda arbetsmarknaden

Permalänk
Skrivet av elBenko:

@heretic16: Du är på rätt väg.

För att en klass ska få lov att implementera ett Interface, så måste klassen åtminstone implementera det som Interfacet säger.
Interfacet säger dock aldrig hur logiken i metoderna ska se ut. Och klassen kan alltid ha ytterligare egenskaper och funktionalitet utöver kraven från Interfacet.

En annan viktig grej är att en klass dessutom kan implementera multipla Interface. Class A Implements Interface1, Interface2, Interface3 etc.

Varvid när det kommer till abstrakta (eller vanliga) klasser så kan en klass bara ärva från en styck annan klass.

Detta är ett rätt luddigt område, det kan ta tid innan polletten trillar ner. Speciellt innan man förstår i vilka situationer man själv kan/bör använda sig av dessa koncept.

Jag läste något för ett antal år sedan som hjälpte mig lite att förstå skillnaderna.
"A class defines who you are, and an interface tells what roles you could play"

Så om jag är en riktigt stor klass som heter Bil. Då kan mina interface vara sport, komfort, träng, folkrace så jag importerar endast det jag behöver? Om det svaret är JA. Då tror jag har greppat tanken bakom interface.

Men inte abstrakta klasser. Är det för att kombinera flera olika klasser i en enda klass?

Permalänk
Medlem
Skrivet av heretic16:

Så om jag är en riktigt stor klass som heter Bil. Då kan mina interface vara sport, komfort, träng, folkrace så jag importerar endast det jag behöver? Om det svaret är JA. Då tror jag har greppat tanken bakom interface.

Men inte abstrakta klasser. Är det för att kombinera flera olika klasser i en enda klass?

Nja, säg att du har flera olika klasser som principiellt är så pass annorlunda att de inte kan ärva från samma superklass. Men de har fortfarande en eller flera funktioner som är samma.

Till exempel du kan ha en abstrakt klass som heter "fordon", med både "cykel" och "bil" som underklasser. Det blir ju rätt när man säger att en cykel är ett fordon. Men sen vill du stoppa in "människa" under "fordon". En människa är ju inte ett fordon.

Men både människan och diverse fordon kan ju röra på sig. Båda har funktionen accelereration.

Så i stället för att stoppa klassen "människa" som underklass till den abstrakta klassen "fordon" så kan du skapa interfacet "IAccelerate" med metoden "Accelerate()" och implementera det på både den abstrakta klassen "fordon" och den lösa klassen "människa".

Hänger du med hur jag menar?

abstrakt class fordon implements IAccelerate -> class bil & class cykel
class människa implements IAccelerate

Sen kan du klumpa ihop allihopa i en lista av typen IAccelerate, loopa över dem med en for each/for-loop och anropa metoden Accelerate() för samtliga. Detta är iaf. ett av de praktiska användningsområdena med interface.

Permalänk
Skrivet av elBenko:

Nja, säg att du har flera olika klasser som principiellt är så pass annorlunda att de inte kan ärva från samma superklass. Men de har fortfarande en eller flera funktioner som är samma.

Till exempel du kan ha en abstrakt klass som heter "fordon", med både "cykel" och "bil" som underklasser. Det blir ju rätt när man säger att en cykel är ett fordon. Men sen vill du stoppa in "människa" under "fordon". En människa är ju inte ett fordon.

Men både människan och diverse fordon kan ju röra på sig. Båda har funktionen accelereration.

Så i stället för att stoppa klassen "människa" som underklass till den abstrakta klassen "fordon" så kan du skapa interfacet "IAccelerate" med metoden "Accelerate()" och implementera det på både den abstrakta klassen "fordon" och den lösa klassen "människa".

Hänger du med hur jag menar?

abstrakt class fordon implements IAccelerate -> class bil & class cykel
class människa implements IAccelerate

Sen kan du klumpa ihop allihopa i en lista av typen IAccelerate, loopa över dem med en for each/for-loop och anropa metoden Accelerate() för samtliga.

Jag förstod inte riktigt. Kan du visa med enkel kod?

Permalänk
Medlem

Interface kommer du se fördelar med när du jobbar i stora gemensamma projekt. Är ett måste då om man jobbar inom samma område och skriver klasser som andra ska använda sig av.

Skickades från m.sweclockers.com

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Skrivet av talonmas:

Interface kommer du se fördelar med när du jobbar i stora gemensamma projekt. Är ett måste då om man jobbar inom samma område och skriver klasser som andra ska använda sig av.

Skickades från m.sweclockers.com

Kunna hela java är ju ett måste.

Permalänk
Medlem
Skrivet av heretic16:

Jag förstod inte riktigt. Kan du visa med enkel kod?

Ok, kör ett exempel i C# då jag bara har Visual Studio på denna burken. Men det fungerar i stort sett likadant i Java.
I C# fungerar "class : class" som javas inherits, och "class : interface" som javas implements.

namespace InterfaceExempel { interface IAccelerate { int Accelerate(); } interface IDeaccelerate { int Deaccelerate(); } interface IMovable : IAccelerate, IDeaccelerate { } // Går bra att skapa ett inteface som är en sammansättning av flera mindre interface abstract class Vehicle : IMovable { private int speed = 0; public int Accelerate() { return speed += 1; } public int Deaccelerate() { return speed -= 1; } } class Car : Vehicle { } class Bicycle : Vehicle { } class Human : IMovable { private int speed = 0; public int Accelerate() { return speed += 1; } public int Deaccelerate() { return speed -= 1; } } class Program { static void Main(string[] args) { Car car = new Car(); Bicycle bicycle = new Bicycle(); Human human = new Human(); IMovable[] movingObjects = new IMovable[] { car, bicycle, human }; foreach (IMovable obj in movingObjects) { obj.Accelerate(); } foreach (IMovable obj in movingObjects) { obj.Deaccelerate(); } } } }

Som du ser så är Interface ett bra sätt att klumpa ihop klasser (som annars är helt olika varandra) efter en eller flera gemensamma funktioner.
Varvid abstrakta klasser är bra när man behöver klumpa ihop klasser efter gemensamma egenskaper.

Permalänk
Medlem
Skrivet av heretic16:

Okej.

Så den abstrakta klassen Player kan innehålla metoder och parametrar från klasserna NPC, Human och Enemy? Vart kommer interface in här någonstans då?

Nu är jag ju inte java mupp som sagt, men generellt så är Interface:t det kontrakt som man visar upp utåt - det är en abstraktion från koden. Vilket gör att man kan ha flera versioner av interface mot samma klass. T.ex. Playerv10 som sedan efterföljs av Player11 kontraktet om det är så att funktionerna inte är bakåtkompatibla.

Fast i läget som vi pratar om nu, med player etc så skulle jag se player som bas-klass och de andra klasserna som arv från den klassen - med vinsten att man har gemensam kod på 1 ställe(och gemensamma egenskaper)

// LZ

Permalänk

Som tidigare nämnts är ett interface bara ett kontrakt på vad dina klasser måste implementera. Dvs så att om du hanterar alla som den klassen vet du vilka bas funktioner du har tillgång till.
En abstract klass är ett objekt du inte ska kunna skapa (dvs de finns ju inget rent Fordon, de är ju antingen bil eller cykel etc) dessutom har fordon gemensamma metoder:

//Creating interafce för alla typer av prylar interface Pryl { int varde();//Alla prylar har ett värde och måste kunna svara på de! } //Creating abstract class Som implementerar ett fordon, alla fordon är en prylar // dessutom har ett fordon en koll på om de har en motor eller inte //Lägg märket till att funktioen varde() inte är definierad här! abstract class Fordon implements Pryl { public boolean harMotor(){return true;} // SOm standard har våra fordon en motor!, sålänge vi implelnterar fordon med motor slipper vi bry oss om detta! } //Creating subclass of abstract class, now we need to provide the implementation of rest of the methods class Cykel extends Fordon{ public int varde(){return 5000);} //VI implementerar värde funktionens som Pryl tvingar oss att göra! @Override public void harMotor(){return false;} //Vi skriver över harMotor funktionen och sätter denna till Falskt, då en cykel inte har motor } //Creating subclass of abstract class, now we need to provide the implementation of rest of the methods class Bil extends Fordon{ public int varde(){return 105000);} //VI implementerar värde funktionens som Pryl tvingar oss att göra! //Vi behöver inte göra något med harMotor, då den som standard returnerar true redan! } //Creating subclass of abstract class, now we need to provide the implementation of rest of the methods class Hus implements Pryl{ public int varde(){return 2500000);} //VI implementerar värde funktionens som Pryl tvingar oss att göra! //Vi behöver inte göra något med harMotor, då den som standard returnerar true redan! } //Creating a test class that calls the methods of A interface class Test5{ public static void main(String args[]){ Pryl mittHus=new Hus(); Pryl minBil=new Bil(); Pryl minCykel=new Cykel(); int totaltVarde = mittHus.varde() + minBil.varde() + minCykel.varde(); //Eftersom vi har 3 prylar vet vi att vi kan räkna ihop allas värde med samma funktion! //DU kan inte på en Pryl kolla om den har Motor //Dvs detta skulle fallera: // minBil.harMotor(); //däremot kan vi skapa bilen direkt såhär: Fordon minBil2 = new Bil(); //Kan vi kolla både harMotor och varde()!: minBil2.varde() minBil2.harMotor() }}

Permalänk

Om ni undrar varför det tar tid för mig att svara så håller jag på att koda lite i Java. Jag ska svara och presentera det jag har gjort.