Avatar billede martinm Nybegynder
08. august 2003 - 15:25 Der er 18 kommentarer og
1 løsning

Generel Java

Hej..

Spøgsmålet her en en række områder, som jeg er i tvivl om.
I Java(eller OO for den sags skyld) taler man om abstrakte klasser eller interfaces med abstrakte metoder.
Hvornår kunn man forestille sig, at benytte dette? Hvorfor er det pænere at skrive Map map = new HashMap() end HashMap map = new HashMap(). Betyder de egentlig noget i de små skoleprojekter jeg lavet pt?
Avatar billede martinm Nybegynder
08. august 2003 - 15:26 #1
Jeg har lige læst http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html?

Og har derfor opdaget, at der er nogle områder, som jeg er usikker på!
Avatar billede dougheffernan Nybegynder
08. august 2003 - 15:33 #2
Q: In Java, under what circumstances would you use abstract classes instead of interfaces? When you declare a method as abstract, can other nonabstract methods access it? In general, could you explain what abstract classes are and when you might use them?

A: Those are all excellent questions: the kind that everyone should ask as they begin to dig deeper into the Java language and object-oriented programming in general.
Avatar billede arne_v Ekspert
08. august 2003 - 15:34 #3
Om du bruger:
  private HashMap m;
eller:
  private Map m;
betyder ikke ret meget.

Hvis du får lyst til at skifte fra HashMap til TreeMap så retter du bare i din klasss.

public HashMap dosomething(HashMap m) {

bør absolut være:

public Map dosomething(Map m) {

fordi hvis du får lyst til at rette i implementationen fra HashMap til TreeMap,
så skal alt den kode der bruger klassen ændres. Og i store projekter kan det
være tusinder af klasserr.

Ved at bruge interfaces kan man derfor ændre implementation en uden
at der skal rettes i noget af den kode der bruger det.

Og det er godt.
Avatar billede dougheffernan Nybegynder
08. august 2003 - 15:34 #4
Avatar billede arne_v Ekspert
08. august 2003 - 15:36 #5
Argumentet har selvfølgelig ikke den store betydning for et 3 klassers
projekt, men man kan jo ligeså godt lære gode vaner som dårlige vaner.

:-)
Avatar billede martinm Nybegynder
08. august 2003 - 15:38 #6
Jeg kan kun se brugen af abstrakte klasser, som noget med benytter fordi OO design siger det. F.eks., hvis man forstiller sig, at Mand og Kvinde arver fra menneske giver det ikke mening at instansiere Menneske, men derimod giver det mening at gøre det ved Mand og Kvinde. Hvorfor så ikke lave et interface, der hedder MenneskeIF og lade Mand og Kvinde implementere det..

Det er vel også en pointe i artiklen ca. 1/3 nede:
Even a class as simple as this one has problems. Consider what happens when a user leverages inheritance and uses the ArrayList's clear() method to pop everything off the stack.
Avatar billede dougheffernan Nybegynder
08. august 2003 - 15:41 #7
Choosing interfaces and abstract classes is not an either/or proposition. If you need to change your design, make it an interface. However, you may have abstract classes that provide some default behavior. Abstract classes are excellent candidates inside of application frameworks.
Avatar billede arne_v Ekspert
08. august 2003 - 15:43 #8
Nej.

En abstrakt basisklasse er yderst fornuftig mekanisme som man tit kan
have meget brug for.

Problemet i det refererde eksempel er at det ikke er en ægte arv.
En stak er *ikke* en specialisering af en ArrayList. Og derfor bør
den ikke extende ArrayList. Det kan være en klasse som indeholder
en ArrayList. Man har altså overtrådt en helt fundamental regel
for arv og har fået et problem. Ikke noget overraskende i det.

[ArrayList er iøvrigt slet ikke abstrakt]
Avatar billede martinm Nybegynder
08. august 2003 - 15:46 #9
Så generelt er det et spørgsmål om at abstrahere så meget, som muligt?
Avatar billede martinm Nybegynder
08. august 2003 - 15:48 #10
arne >> Det er jeg glad for du siger, for jeg undrede mig en del over afsnittet med ArrayList.

I øvrigt en fin artikel fra JavaWorld da fandt dougheffernan.
Avatar billede martinm Nybegynder
08. august 2003 - 15:51 #11
Så hvis man holder et interface op imod en abstrakt klasse (som f.eks. 08/08-2003 15:38:22), er den abstrakte klasse vel kun en fordel, da der ikke kan laves objekter af den.
Avatar billede arne_v Ekspert
08. august 2003 - 15:55 #12
Hele formålet med OOP (som med alle de foregående programmeings paradigmer)
er at reducere omkostningen til udvikling og vedligehold. Det drejer sig
om at gøre koden nem at overskue. Og det drejher sig om at man skal
kunne ændre et sted i koden uden at skulle ændre 10000 andre steder.

Et interface er en kontrakt. Den her klasse sværger at have en metode
der gør det og det. Det er fy fy nogensinde at fjerne metoder fra
interfaces eller ændre deres signatur. Det er en lang tids kontrakt.

Anden kode kan derfor udvikles udfra en forudsætning om at den kontrakt
holder. Implementationen kan ændres, fejl kan rettes, det hele kan redesignes
for at få bedre performance etc.. Det påvirker ikke kontrakten og derfor
påvirker det ikke andre.

En abstrakt basis-klasse er et fundament i arv. Det er faktisk ret
sjældent at det giver mening at extende en konkret (ikke abstrakt)
klasse. Det er meget sjældent at det giver mening at have en instans
af noget at have en instans af en specialisering af det første.
Det hnder men er sjældent. Men der er jo generaliseringer/specialiseringer.
Og basis-klasser vil typisk være abstrakte. De har nogle generelle
egenskaber. Men kan forekomem rkun som specialiseringer der tilføjer
et eller andet specifikt.
Avatar billede arne_v Ekspert
08. august 2003 - 15:58 #13
De er helt forskellige.

Et interface er en konktrakt.

En abstrakt basis-klasse er en generalisering af egenskaber.

Man kan ikke instantiere nogen af dem.

Et interface kan siges at være en speciel abstrakt basis-klasse
uden nogen metode implementation (og det er faktisk sådan at
interfaces er defineret i C++).
Avatar billede martinm Nybegynder
08. august 2003 - 16:05 #14
Ok. Der faldt nogle brikker på plads! Så hans artikel er faktisk noget skidt for en begynder som mig. Jeg symes den forvirre, men er ok som oplæg til en diskussion.
Avatar billede arne_v Ekspert
08. august 2003 - 16:06 #15
Men iøvrigt er betragtningen om at der extendes for meget rigtig.

Man skal tænke sig lidt om. Og hvis ikke både sup og sub klasse
er designet til det fra start af, så vil encapsulation ofte
være bedre end arv.

ArrayList er f.eks. ikke designet til at blive extended.
Avatar billede martinm Nybegynder
08. august 2003 - 16:10 #16
Ja, der findes vist ingen forkromet svar på, hvornår det ene er bedre end det andet. En vurderingssag. Men dine informationer har hjulpet mig meget.. Tror, der er mange nye udviklings-aspiranter, der er meget i tvivl om dette.
Avatar billede arne_v Ekspert
08. august 2003 - 16:12 #17
Jeg ved ikke om det er en dårlig artikel.

Indholdet er både relevant og rigtigt.

Men den giver måske mest mening, hvis man selv har lidt
erfaringer med nogle af de ting der kan gå galt.
Avatar billede arne_v Ekspert
08. august 2003 - 16:13 #18
Som med så meget andet så skal man tænke selv.

Og vær glad for det. Ellers blev vi jo erstattet af programmer.
Avatar billede martinm Nybegynder
08. august 2003 - 16:17 #19
*g* Ja.. Det er tankevækkende!
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