Avatar billede gladmhensk Nybegynder
11. januar 2004 - 18:29 Der er 22 kommentarer og
2 løsninger

Grænseflader og abstrakte metoder

Hey !
Har to områder jeg ikke helt har fået styr på. Tror de hænger sammen på en eller anden måde...

Kan nogen forklare hvornår man laver en abstrakt metode ? (helst eksempel)

Og hvad er grænseflader/interfaces ?

Fatter stortset hat af grænseflader så det kan godt være at man ikke kan spørge på den måde men det kan i jo lige skrive så...
Avatar billede arne_v Ekspert
11. januar 2004 - 18:39 #1
En abstrakt metode er en metode i en klasse der kun er sat plads af til men
som ikke er implementeret.

Klasser der arver fra klassen skal så implementere metoden.

"Dem der arver fra mig skal lave sådan en metode her"
Avatar billede arne_v Ekspert
11. januar 2004 - 18:40 #2
Et interface er en speciel klasse med ene abstrake metoder.
Avatar billede arne_v Ekspert
11. januar 2004 - 18:41 #3
Du kan ikke instantiere en abstrakt klasse (en klasse som indeholder
en eller flere abstrakte metoder).
Avatar billede arne_v Ekspert
11. januar 2004 - 18:43 #4
Nu tænker du sikkert: hvorfor overhovedet lave den abstrakte metode ?
(klasser der arver kunne jo alligevel lave en metode hvis de har lyst til det)

Pointen er at andre metoder i den abstrakte klasse sagtens kan kalde den
abstrakte metode. Fordi der vil være noget at kalde når det skal køres.
Avatar billede arne_v Ekspert
11. januar 2004 - 18:45 #5
Fordelen ved et interface er at ved at operere på interfaces, så kan man
udskifte implementationen uden at ret meget kode påvirkes af det, sålænge
den nye implementation bare har det samme interface.
Avatar billede _carsten Nybegynder
11. januar 2004 - 18:53 #6
Jeg vil lige supplere Arne's kommentarer med et eksempel jeg lavede engang da jeg var i samme situation som dig - jeg blev selv meget klogere af at lave eksemplet, håber det samme sker for dig.

Lavede også et med interfaces - hvis jeg kan finde det, kaster jeg det her

Abstracte klasser:


/** Dette er et eksempel på polymorphism på et lidt lavere niveau
* end det kunne have været, brugen af interfaces ville have bragt
* det endnu længere ( det ultimative ), men princippet her er, at man
* laver en abstract classe, der extendes af andre classes, hvis sub-
* classerne ikke overrider metoden i den abstracte classe, er disse
* classer selv abtracte, (en abstract classse kan ikke initieres).
* En subclass kan initieres med reference til superclassen, hvilket
* gør, at man med reference til superclassen, kan kalde metoder i sub-
* classen. Java's JVM beslutter under runtime hvilket object der er
* tale om, i dette eksempel et Dog, Cat eller Bird object.
* Det er også muligt at lave en class, hvis metode tager en abstract
* class som parameter, i eksemplet her classen "WhoKnowsWhatToCome",
* denne class aner ikke hvad den modtager som paramter, dog ved den
* at den modtager en class som extender en abstract classe der
* implementerer metoden snakker().
*/

abstract class Polymorphism {
    abstract void snakker();
}


class Dog extends Polymorphism{
    public void snakker(){
        System.out.println("Vov - vov - vov");
    }
}


class Cat extends Polymorphism{
    public void snakker(){
        System.out.println("Miiau - miiau - miiau");
    }
}


class Bird extends Polymorphism{
    public void snakker(){
        System.out.println("Pip - pip - pip");
    }
}



class WhoKnowsWhatToCome{
    public WhoKnowsWhatToCome(Polymorphism subject){
        subject.snakker();
    }
}


public class TestPolymorphism{
    public static void main(String[] args){
        Polymorphism p; // Reference til den abstracte classe
       
        p = new Dog();
        System.out.print("Hunden siger: ");
        p.snakker();
   
        p = new Cat();
        System.out.print("Katten siger: ");
        p.snakker();
       
        p = new Bird();
        System.out.print("Fuglen siger: ");
        p.snakker();
       
        System.out.println("\nMed classen WhoKnowsWhatToCome der tager" +
                          "en abstract classe som parameter");
        System.out.print("Hunden siger: ");
        new WhoKnowsWhatToCome(new Dog());
        System.out.print("Katten siger: ");
        new WhoKnowsWhatToCome(new Cat());
        System.out.print("Fuglen siger: ");
        new WhoKnowsWhatToCome(new Bird());
    }
}
Avatar billede gladmhensk Nybegynder
11. januar 2004 - 19:14 #7
Må sige at det er et godt eksempel, men kunne man ikke have lavet Polymorphism klassen som en normal (altså ikke abstract) ? Har endnu ikke helt fået fat i HVORFOR og hvad er betingelserne for at bruge metoder fra en abstract klasse ?


class WhoKnowsWhatToCome{
    public WhoKnowsWhatToCome(Polymorphism subject){
        subject.snakker();
    }
}
Kan du/i forklare den lidt nærmere ?
Avatar billede arne_v Ekspert
11. januar 2004 - 19:42 #8
Nu synes jeg at eksemplet ligger mere op til et interface, men ...

Hvis Polymorphism skulle have været lavet som en ikke abstrakt
klasse så skulle den have set ud som:

class Polymorphism {
    void snakker() {
        System.out.println("Kan du læse dette så har en programmør lavet en bøf");
    }
}

Fordi det giver ikke mening at instantiere et ibjekt af denne type.

Men ved ar erklære den som abstrakt sikrer compileren at man ikke
laver en bøf.
Avatar billede arne_v Ekspert
11. januar 2004 - 19:43 #9
Man kan bruge abstrakte metoder helt på samme måde som enhver anden metode.
Avatar billede arne_v Ekspert
11. januar 2004 - 19:52 #10
Her er en variant af Carstens eksempel hvor man kan se abstrakte metoder blive
brugt i samme klasse som de er defineret i:

abstract class Animal {
    abstract String getSound();
    abstract String getName();
    void talks() {
        System.out.println(getName() + " siger: " +
                          getSound() + " " + getSound() + " " + getSound());
    }
}

class Dog extends Animal {
    String getSound() {
        return "vov";
    }
    String getName() {
        return "Hunden";
    }
}

class Cat extends Animal {
    String getSound() {
        return "mjav";
    }
    String getName() {
        return "Katten";
    }
}

class Bird extends Animal{
    String getSound() {
        return "pip";
    }
    String getName() {
        return "Fuglen";
    }
}

public class TestPolymorphism{
    public static void main(String[] args){
        Animal p;
        p = new Dog();
        p.talks();
        p = new Cat();
        p.talks();
        p = new Bird();
        p.talks();
    }
}
Avatar billede arne_v Ekspert
11. januar 2004 - 19:53 #11
Den generelle logik ligger i Animal klassen, men Dog/Cat/Bird klasserne
kun bidrager med den specifikke information om dem,
Avatar billede gladmhensk Nybegynder
11. januar 2004 - 20:34 #12
Okay, tror jeg har fået fat i det med abstrakte metoder men interfaces kunne jeg godt tænke nogle eksempler med :)
Avatar billede arne_v Ekspert
11. januar 2004 - 20:37 #13
Du kan tage Carstens eksempel og lave den abstrakte klasse om til et interface.

interface Polymorphism {
    public  void snakker();
}
Avatar billede arne_v Ekspert
11. januar 2004 - 20:40 #14
(du skal så bruge implements og ikke extends)
Avatar billede arne_v Ekspert
11. januar 2004 - 20:44 #15
Jeg lavede engang et lille factory eksempel.

Foobar.java:

public interface Foobar {
  public void doit();
}

FoobarA.java:

public class FoobarA implements Foobar {
  public void doit() {
      System.out.println("I am A");
  }
}

FoobarB.java:

public class FoobarB implements Foobar {
  public void doit() {
      System.out.println("I am B");
  }
}

LibraryFactory.java:

public class LibraryFactory {
  public static Foobar newFoobar(String letter) {
      Foobar res;
      try {
        res = (Foobar)Class.forName("Foobar" + letter).newInstance();
      } catch (InstantiationException e) {
        res = null;
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        res = null;
        e.printStackTrace();
      } catch (ClassNotFoundException e) {
        res = null;
        e.printStackTrace();
      }
      return res;
  }
  public static void main(String[] args) {
      Foobar a = LibraryFactory.newFoobar("A");
      a.doit();
      Foobar b = LibraryFactory.newFoobar("B");
      b.doit();
  }
}

Det viser også brug af interface.
Avatar billede gladmhensk Nybegynder
11. januar 2004 - 21:17 #16
Så man bruger altså abstrakte metoder som interfaces for at kunne lave et bedre heiraki ved design ? (Java kører jo ellers med enkelt nedarving..
Avatar billede arne_v Ekspert
11. januar 2004 - 21:20 #17
Et interface er noget man bruger til at beskrive funktionen uafhængig
af implementationen.

En klasse kan I Java kun extende en klasse men kan implementere mange
interfaces.
Avatar billede gladmhensk Nybegynder
12. januar 2004 - 14:51 #18
evt. en smule uddybning af interfaces ? Og "implementationen" hvad er det ? Skal helst ha skåret det ud i pap :)
Avatar billede arne_v Ekspert
12. januar 2004 - 16:35 #19
interface = hvordan det ser ud eksternt
implementation = hvordan det er lavet internt

public interface Foobar {
  public void doit();
}

Definerer at alle Foobar'er har en void metode doit.

public class FoobarA implements Foobar {
  public void doit() {
      System.out.println("I am A");
  }
}

Er en konkret Foobar hvor doit gør noget specifikt.
Avatar billede gladmhensk Nybegynder
12. januar 2004 - 16:44 #20
Okay, kan man dele variabler etc. ? eller er det kun metoder ?
Avatar billede arne_v Ekspert
12. januar 2004 - 16:48 #21
Jeg forstår ikke helt hvad du mener med "dele".

Et interface kan kun indeholde metoder og så konstanter (public static final).

Og det er kun metoder som kan være abstrakte (i Java).
Avatar billede gladmhensk Nybegynder
12. januar 2004 - 17:02 #22
Så fik jeg det afklaret :)
Jeg siger tak ! Jeg kan jo altid spørge igen senere hvis der er noget andet jeg er i tvivl :O
Synes dog også at carsten skal lave et svar (dog får arne_v største delen af point :)

Takker !
Avatar billede _carsten Nybegynder
16. januar 2004 - 07:44 #23
Så er jeg vågnet op igen!

Da Arne har trukket læsset her, er det kun rimeligt han får alle point.
Avatar billede arne_v Ekspert
23. januar 2004 - 22:14 #24
Lukke tid ?
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