Abrakte klasser og super klasser

Tags:    java


Når man snakker arv, taler man både om abstrakte klasser og om almindelige superklasser.

En super klasse bliver ikke defneret, men bliver en superklasse i kræft at, at den har en underklasse der skriver extends.

En Abstrakt klasse har derimod abstrakt stående oppe i klasse defineringen?

Jeg kan ikke helt se hvornår man skal bruge abstrakte klasser, men kan derimod godt se hvornår det er smart at bruge almindelige superklasser.

Hvad er forskellen helt præcist?


TB



5 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato

Når man snakker arv, taler man både om abstrakte klasser og om almindelige superklasser.

En super klasse bliver ikke defneret, men bliver en superklasse i kræft at, at den har en underklasse der skriver extends.

En Abstrakt klasse har derimod abstrakt stående oppe i klasse defineringen?

Jeg kan ikke helt se hvornår man skal bruge abstrakte klasser, men kan derimod godt se hvornår det er smart at bruge almindelige superklasser.

Hvad er forskellen helt præcist?


TB


En abstrakt klasse kaldes ofte en prototype. Enhver klasse der indeholder abstrakte metoder kaldes abstrakte klasser, dette angives ved at skrive "abstract" foran klasse navnet. En abstrakt metode er, som Jimmy beskriver, bare et skelet for selve metoden.
En abstrakt klasse kan godt indeholde ikke abstrakte metoder!

Idéen er at man selv skal lave de abstrakte metoder i sin egen klasse der nedarver fra den abstrakte klasse.

Interface minder meget om abstrakte klasser, dog behøver man ikke at "extends" et interface, det skal istedet "implements"
I Java kan man kun extende en klasse, men implemente alle de klasser man har behov for. Et interface består kun af abstrakte metoder (selvom man ikke behøver skrive abstract foran dem).

Eksempel hvis du har et interface der hedder hus. Selve skelettet kan så være: badeværelse, køkken, soveværelse stue. Derfor ved du at når man bygger et hus skal det indeholde et badeværelse, køkken, soveværelse og en stue. Hvordan du bygger disse er op til dig selv :-)

Håber det var nok til at forklare forskellen på interface og abstract samt hvorfor det er nyttigt.

[Redigeret d. 08/03-05 17:09:36 af Erling Veidal]

[Redigeret d. 08/03-05 17:10:38 af Erling Veidal]



Nu er der allerede mange der har svaret, men jeg prøver alligevel:

- En abstrakt klasse kan ikke instantieres, dvs. alle instanser af abstrakte klasser er i virkeligheden instanser af subklasser.

- Abstrakte metoder SKAL implementeres i de nedarvede klasser.

Sådan som jeg har brugt abstrakte klasser, har jeg tit gjort constructors protected og så ellers oprettet en statisk metode i den abstrakte klasser som returnerer en instans af den rigtige subklasse.

Eksempelvis:

Fold kodeboks ind/udKode 


Et eksempel, hvor meningen er at DataLoader skal læse data fra en given kilde (URL, fil eller database). Selve DataLoader klassen skal primært returnere en DataLoader instans som kan give adgang til datakilden (via InputStream).

Brugen vil således være noget a la:

Fold kodeboks ind/udKode 


Håber det hjalp lidt på vej.







Når man snakker arv, taler man både om abstrakte klasser og om almindelige superklasser.

En super klasse bliver ikke defneret, men bliver en superklasse i kræft at, at den har en underklasse der skriver extends.

En Abstrakt klasse har derimod abstrakt stående oppe i klasse defineringen?

Jeg kan ikke helt se hvornår man skal bruge abstrakte klasser, men kan derimod godt se hvornår det er smart at bruge almindelige superklasser.

Hvad er forskellen helt præcist?


TB


Hejsa.
Det er rigtigt at en klasse bliver til en "superklasse" når der er nogen som arver fra den. Nogen vælger også at kalde den en forældre/parent.

En abstrakt klasse gør i bund og grund det samme, men det er ikke alt som er implementeret i den.

Der findes også en type som hedder interface (hvis du kender til den). Denne klasse har ingen af metoderne implementeret. dvs. at der kun er et metodenavn+parameterliste (eks. public void myFunction(int variable); <-- bemærk at der ikke er nogen krop på metoden.

Forskellen mellem din "superklasse" og din abstrakte klasse er så, at den abstrakte klasse ikke have alle sine metoderskrop lavet, mens din "superklasse" har.

Det smarte ved at bruge en abtrakt klasse er, at man ikke kan bruge denne direkte. Dette kan man derimod med en "superklasse".
Dvs. at hvis du laver en abstrakt klasse og en almindelig klasse, kan du kun oprette en instans af en "normal" klasse.

NB. Grunden til at jeg har skrevet superklasse i gåseøjne, er fordi at alle klasser der i bund og grund arves fra, er en superklasse.

-------------------------------
Hilsen Jimmi Westeberg
http://www.westsworld.dk / http://www.aktivudvikler.dk




[
Hejsa.
Det er rigtigt at en klasse bliver til en "superklasse" når der er nogen som arver fra den. Nogen vælger også at kalde den en forældre/parent.

En abstrakt klasse gør i bund og grund det samme, men det er ikke alt som er implementeret i den.

Der findes også en type som hedder interface (hvis du kender til den). Denne klasse har ingen af metoderne implementeret. dvs. at der kun er et metodenavn+parameterliste (eks. public void myFunction(int variable); <-- bemærk at der ikke er nogen krop på metoden.

Forskellen mellem din "superklasse" og din abstrakte klasse er så, at den abstrakte klasse ikke have alle sine metoderskrop lavet, mens din "superklasse" har.

Det smarte ved at bruge en abtrakt klasse er, at man ikke kan bruge denne direkte. Dette kan man derimod med en "superklasse".
Dvs. at hvis du laver en abstrakt klasse og en almindelig klasse, kan du kun oprette en instans af en "normal" klasse.

NB. Grunden til at jeg har skrevet superklasse i gåseøjne, er fordi at alle klasser der i bund og grund arves fra, er en superklasse.

-------------------------------
Hilsen Jimmi Westeberg
http://www.westsworld.dk / http://www.aktivudvikler.dk
]

Hvis man har opbygget et klasseheraki som indeholder abstrakte klasser,skal man så skriver super for at kalde en metode fra klassen over (den klasse man har arvet fra)

eksempelvis hvis man har en printmetode print() i den pågældende klasse, som også skal udskrive noget via en metode fra klassen over som hedder print1. Skriver man så super.print1(); inden i print() metoden for at kombinerer dem.

Håber det er forståeligt.

MvH


TB



Hvis man har opbygget et klasseheraki som indeholder abstrakte klasser,skal man så skriver super for at kalde en metode fra klassen over (den klasse man har arvet fra)

eksempelvis hvis man har en printmetode print() i den pågældende klasse, som også skal udskrive noget via en metode fra klassen over som hedder print1. Skriver man så super.print1(); inden i print() metoden for at kombinerer dem.

Håber det er forståeligt.

MvH


TB

Når du nedarver, skal du som det første i din egen klasses constructor skrive super(); på denne måde har du allerede lavet en instans af den klasse du nedarver. Hvis du glemmer at skrive super(), prøver Java at gøre det automatisk når du compiler!

Ved at benytte extends, fortæller du compileren at denne klasse bygger videre på super klassen, derfor kan du direkte tilgå alle superklassens metoder.

Husk at hvis det er abstrakte metoder, skal du selv definere indholdet.

Eksemplet bliver:
print(){
print1();
}

[Redigeret d. 08/03-05 18:08:22 af Erling Veidal]

[Redigeret d. 08/03-05 18:08:46 af Erling Veidal]



t