Avatar billede langkiller Nybegynder
21. juni 2013 - 12:38 Der er 15 kommentarer og
1 løsning

Java abstract interface frem for abstract class?

Jeg har for nyligt oprettet et spørgsmål i samme kategori, men er blevet i tvivl om noget efterfølgende så her er mit spørgsmål så:

Jeg er lidt i tvivl omkring hvornår det er godt at benytter interfaces frem for abstrakte klasser i java..
Jeg kan se en pointe med at vælge en abstract class frem for interface fordi at en subclass til en abstract class kun skal implementere de abstrakte metoder og ikke de "normale".. En interface kræver at man implementerer ALLE dens metoder.

Hvorfor laver man ikke bare lave en abstract class KUN med abstrakte metoder i? Ville det ikke være det samme ?? .. Det går jeg selvfølgelig ikke ud fra, da der må være en mening med at bruge interfaces
Avatar billede langkiller Nybegynder
21. juni 2013 - 13:45 #1
jeg spørger lige på en anden måde:
Hvad er fordelene ved at bruge abstrakte klasser frem for interfaces?
Og omvendt?
Avatar billede erikjacobsen Ekspert
21. juni 2013 - 14:55 #2
En "abstract class KUN med abstrakte metoder" er næsten et interface, med disse forskelle:

1) Du kan kun nedarve een gang, så hvis du bruger en abstract class, så er der ikke mere nedarvning mulig.

2) En "abstract class KUN med abstrakte metoder" kan også indeholde variabler/felter/properties til de objekter der laves ud fra klassen.
Avatar billede arne_v Ekspert
21. juni 2013 - 14:56 #3
interface = ren kontrakt

abstrakt klasse = noget kontrakt og noget implementation

I C++ har man ikke begrebet interface  og saa bruger man en klasse med ene abstrakte metoder (pure virtual metode i C++ terminologi).

I Java vil man bruge interface naar det nu er der.

Grunden til at Java har faaet interface er formentligt at man gerne vil promovere den form for kontrakt programmering.

Det ses ioverigt nogen gange at man har:

interface----abstrakt basis klasse----konkret klasse

hvor:

interface = kontrakt

abstrakt basis klasse = implementation som er ens uanset hvad

konkret klasse = specifik implementation
Avatar billede arne_v Ekspert
21. juni 2013 - 15:06 #4
For et eksempel paa det sidste (og med diverse andre pointer):


public class OopFun {
    public static void test(Animal a) {
        a.sayMany(3);
        System.out.println(a.getDescription());       
    }
    public static void main(String[] args) {
        test(new Dog());
        test(new Cat());
    }
}

interface Animal {
    public void sayOne();
    public void sayMany(int n);
    public String getDescription();
}

abstract class AnimalBase implements Animal {
    public abstract void sayOne();
    public abstract String getType();
    public void sayMany(int n) {
        for(int i = 0; i < n; i++) {
            sayOne();
        }
    }
    public String getDescription() {
        return "I am a " + getType();
    }
}

class Dog extends AnimalBase {
    public void sayOne() {
        System.out.println("Vov");
    }
    public String getType() {
        return "dog";
    }
}

class Cat extends AnimalBase {
    public void sayOne() {
        System.out.println("Mjav");
    }
    public String getType() {
        return "cat";
    }
}
Avatar billede langkiller Nybegynder
21. juni 2013 - 15:47 #5
erikjacobsen: Hvornår kunne det være nyttigt at nedarve mere end en interface?

arne_v: Hvorfor er det overhovedet nødvendigt at have sådan en kontrakt? Det sidder jeg stadig og funderer over
Avatar billede arne_v Ekspert
21. juni 2013 - 15:51 #6
Fordi det er nemmere for dig at skifte implementation hvis du udelukkende programmer op mod kontrakten.
Avatar billede arne_v Ekspert
21. juni 2013 - 15:55 #7
Man kan godt vaere interesseret i at noget har to kontrakter.

Hvis vi fortsaetter mit eksempel:

interface Animal {
    public void sayOne();
    public void sayMany(int n);
    public String getDescription();
}

interface Persistable {
        public void loadData(String storage);
        public void saveData(String storage);
}

Hvis noget baade skulle overholde Animal kontrakten og Persistable kontrakten saa skal det implementere begge interfaces.
Avatar billede langkiller Nybegynder
21. juni 2013 - 16:01 #8
Håber ikke jeg spørger dumt nu... men hvad mener du med at skifte implementation? Mener du så at man dropper en interface og tilføjer en anden istedet? hvordan foregår det ?
Avatar billede langkiller Nybegynder
21. juni 2013 - 16:20 #9
forstår godt det med at implementerer 2 eller flere interfaces. det er jol også meget praktisk.. men det du siger med at "skifte implementation" forstår jeg ikke helt
Avatar billede arne_v Ekspert
21. juni 2013 - 16:42 #10
Hvis nu f.eks. du har 717 metoder der bruger ArrayList<T> og du vil skifte til LinkedList<T> saa skal du rette 717 metoder.

Hvis du har 717 metoder der bruger List<T> saa kan du skifte implementation fra ArrayList<T> til LinkedList<T> uden at rette i de 717 metoder.
Avatar billede langkiller Nybegynder
21. juni 2013 - 17:08 #11
Aahaaa .. det giver jo meget god mening :) rigtig godt eksempel

.. det vil ikke være muligt hvis List var en abstrakt klasse og ikke interface?
Avatar billede arne_v Ekspert
21. juni 2013 - 18:38 #12
Jo.

Men interface er den rene vare - det mest generelle.
Avatar billede langkiller Nybegynder
21. juni 2013 - 18:52 #13
Kan du uddybe det lidt.. den rene vare ?

ellers bare læg et svar.. synes jeg har ret godt styr på det nu
Avatar billede arne_v Ekspert
21. juni 2013 - 18:59 #14
Ren i den forstand at det er ren kontrakt ingen implementation.

(ihvertfald de naeste 6 maaneder - Java 8 er paa vej!)
Avatar billede langkiller Nybegynder
21. juni 2013 - 19:36 #15
selvfølgelig. Så jeg siger mange tak for hjælpen .. igen igen:)
smid et svar.
ericjacobsen du kan også smide et svar hvis du vil have point
Avatar billede arne_v Ekspert
21. juni 2013 - 19:57 #16
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester