Pagina 1 van 3 123 LaatsteLaatste
Weergegeven resultaten: 1 t/m 10 van 23
  1. #1
    Gevorderd   Toelly's schermafbeelding
    Geregistreerd
    14 May 2009
    Locatie
    Sint-Niklaas
    Berichten
    341
    Bedankjes
    72
    Bedankt
    677 keer in 257 posts

    [JAVA] Info over abstracte klassen en interfaces

    Zoals de titel al zegt, heb ik het een beetje moeilijk met het verschil te zien tussen abstracte klassen en interfaces. Ik weet wel wat een abstracte klassen is en wat een interface is, maar ik snap niet echt wat het verschil in functie is binnen het programma, evenals het nut van een abstracte klasse en een interface.

    Groeten,
    Toelly
    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987

  2. #2
    Administrator   ultddave's schermafbeelding
    Geregistreerd
    24 June 2006
    Locatie
    Genk
    Berichten
    1.527
    Bedankjes
    5.385
    Bedankt
    2.577 keer in 1.271 posts
    In C++ zijn bepaalde functies van die klasse virtual. (Zodat je die functies kan 'overriden' in afgeleide klassen ervan).

    Dus in je abstracte klasse heb je een virtual/abstract functie genaamd "test()" bijvoorbeeld. En dan heb je een klasse "ultddave" en die klasse erft over van die abstracte klasse. En in "ultddave" heb je ook een functie genaamd "test()".

    Als je dan "test()" gaat uitvoeren op die abstracte klasse (via polymorfisme), gaat eigenlijk "test()" in ultddave uitgevoerd worden.

    Als je inheritance (overerving) en polymorfisme hebt gezien dan zal hopelijk bovenstaande uitleg volstaan.

    http://java.sun.com/docs/books/tutor.../abstract.html

    Interfaces zullen wel pure virtual klassen zijn. Dat zijn abstracte klassen waarbij geen method body geimplementeerd is, en die klasse bevat dus eigenlijk geen eigen methodes. Alle functies/methods zijn virtual en kunnen dus overriden worden in de afgeleide klasse. Door enkel bepaalde functies toe te laten, kan je dus een protocol maken.

    Een interface is dus een 'nog abstractere' versie van een abstract klasse. Aangezien de abstracte klasse nog een paar eigen functies zal hebben. Maar een interface heeft enkel abstracte / virtual functies en methods.

    Het doel is dus meestal voor restricties, regels of protocollen te maken. Opzich ga je abstracte klassen wel regelmatig nodig hebben als je veel met overerving werkt. Interfaces bijna niet.

    Maar ik programmeer zelden in Java, dus kan zijn dat er ergens een fout zit ;D. Maar volgens de uitleg van wiki is dat hetzelfde als een klasse met virtual functies.
    http://en.wikipedia.org/wiki/Abstract_type
    http://java.sun.com/docs/books/tutor.../abstract.html

    Mvg,
    Dave
    Laatst gewijzigd door ultddave; 15 January 2010 om 17:32
    "Friendship. It's the hardest thing in the world to explain. It's not something you learn in school. But if you haven't learned the meaning of friendship, you really haven't learned anything." ~ Muhammad Ali

  3. De volgende gebruiker bedankt ultddave voor deze nuttige post:

    Toelly (15 January 2010)

  4. #3
    Gevorderd   Toelly's schermafbeelding
    Geregistreerd
    14 May 2009
    Locatie
    Sint-Niklaas
    Berichten
    341
    Bedankjes
    72
    Bedankt
    677 keer in 257 posts
    Je uitleg klopt volgens mij ook wel, heel erg bedankt daarvoor

    Maar wat als je nu naast de klasse "ultddave" ook de klasse "toelly" hebt, met ook diezelfde functie "test()". Wanneer je dan op die abstracte klasse "test()" uitvoert, dan weet die toch niet of de "test()" uit "ultddave" of uit "toelly" moet gebruikt worden?

    En in het algemeen, wat is het nut van abstracte klassen en interfaces? In jouw voorbeeld herschrijf je de functie "test()" toch helemaal uit in "ultddave". Waarom moet je die dan nog eens (onnodig?) typen in een abstracte klasse?

    mvg
    Toelly
    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987

  5. #4
    Erelid/Spyware Slayer  
    Geregistreerd
    10 May 2005
    Berichten
    1.977
    Bedankjes
    119
    Bedankt
    373 keer in 248 posts
    Een abstracte klasse kan niet geïnstantieerd worden, je moet hem eerst extenden. Een abstracte klasse bevat meestal nog methods die niet gedefinieerd zijn (geen body). Je kan dan een nieuwe klasse definiëren en daarmee de abstracte klasse extenden (overerving), je moet dan minstens alle abstracte methods (zonder body in de abstracte klasse) definiëren in de nieuwe klasse.
    Dit is handig als bepaalde klasse ongeveer hetzelfde doen, je kan dan de methods die voor alle klasse hetzelfde zijn al in de abstracte klasse definiëren en de methods die dan hun 'eigen ding' doen abstract laten. Je moet deze methods dan pas definiëren als je de klasse extend. Het enige verschil tussen dit en gewoon overerven (extending) is dat een abstracte klasse niet gebruikt kan worden (kan je niet instancieren), je moet hem eerst extenden en alle methods definiëren. Het voordeel is dat je de gemeenschappelijke delen niet telkens opnieuw hoeft te schrijven.

    Een interface dient om een bepaalde 'functionaliteit' te definiëren, voor deze functionaliteit zijn bepaalde methods (en properties) nodig. Zo kan je verschillen de objecten, die voor totaal andere dingen dienen toch op dezelfde manier gebruiken. In Java bestaan er bijvoorbeeld interfaces om objecten te sorteren, deze interface bevat bepaalde functies bv. de method compareTo: als je nu een array of collectie van dit object wil sorteren zal java kijken of een object groter is als de andere door de compareTo method aan te roepen. Maar we kunnen niet alle objecten op dezelfde manier vergelijken:

    Als we integers vergelijken is 10 groter als 2, als dit nu Strings zijn is het net omgekeerd, dit kunnen we dan bepalen in de compareTo method. Dus dezelfde functionaliteit, voor twee totaal verschillende manieren op dezelfde manier geïmplementeerd met een Interface.

    Maar wat als je nu naast de klasse "ultddave" ook de klasse "toelly" hebt, met ook diezelfde functie "test()". Wanneer je dan op die abstracte klasse "test()" uitvoert, dan weet die toch niet of de "test()" uit "ultddave" of uit "toelly" moet gebruikt worden?
    Je kan de method test niet aanroepen op de abstracte klasse, je kan hem immers niet instanciëren, je kan wel de klasse ultdave en toelly de abstractie klasse laten extenden. Dan kan je objecten van ultdave en toelly aanmaken en de methods daar aanroepen (als je de method test op ultdave aanroept zal die method van ultdave aangeroepen, idem voor toelly).

  6. De volgende gebruiker bedankt Martijnc voor deze nuttige post:

    ultddave (15 January 2010)

  7. #5
    Gevorderd   Toelly's schermafbeelding
    Geregistreerd
    14 May 2009
    Locatie
    Sint-Niklaas
    Berichten
    341
    Bedankjes
    72
    Bedankt
    677 keer in 257 posts
    Bedankt Martijnc, ik ben er nu al een stuk wijzer uit geworden

    Wat ik nu echter nog altijd niet snap is wat het echte nut van interfaces en abstracte klassen is. In een abstracte klasse bijvoorbeeld definieer je een aantal methodes, maar niks concreet. Daarna extend je een andere klasse met deze abstracte klasse, maar je moet nog altijd alle methodes intypen? Dat levert dan toch niks van winst op?
    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987

  8. #6
    Erelid/Spyware Slayer  
    Geregistreerd
    10 May 2005
    Berichten
    1.977
    Bedankjes
    119
    Bedankt
    373 keer in 248 posts
    Je kan in een abstracte klasse bepaalde methods al definiëren, en andere nog niet (alleen de functie definitie, zonder body), alle klasse die deze abstracte klasse extenden moeten de abstracte methods uit de abstracte klasse definiëren. (er kunnen uiteraard nog abstracte methods zijn hierna maar dan is de klasse nog steeds abstract, een klasse is abstract zolang er nog abstracte members inzitten).

    Als je dus twee klasse hebt die voor 90% net hetzelfde doen, kan je die 90% in een abstracte klasse definiëren, de overige 10% laat je abstract, daarna extend je deze twee keer en in deze twee nieuwe klasse definieer je de overige 10% maar dan in beide klasse op een ander manier, het voordeel is dus dat je die 90% gemeenschappelijke functionaliteit niet twee keer moet maken (en bij fouten niet twee keer moet aanpassen).

  9. #7
    Gevorderd   Toelly's schermafbeelding
    Geregistreerd
    14 May 2009
    Locatie
    Sint-Niklaas
    Berichten
    341
    Bedankjes
    72
    Bedankt
    677 keer in 257 posts
    Dus je kan in je abstracte klasse je methoden wel volledig definiëren? Of kan je enkel je niet-abstracte methoden in je klasse volledig definiëren en abstracte niet?
    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987

  10. #8
    Erelid/Spyware Slayer  
    Geregistreerd
    10 May 2005
    Berichten
    1.977
    Bedankjes
    119
    Bedankt
    373 keer in 248 posts
    Dus je kan in je abstracte klasse je methoden wel volledig definiëren? Of kan je enkel je niet-abstracte methoden in je klasse volledig definiëren en abstracte niet?
    Je kan in een abstracte klasse methods inderdaad volledige definiëren (met body, code tussen de {} ) en je kan methods abstract maken (zonder body).

    Een gewone klasse (niet abstract) kan nooit abstracte methods bevatten, vanaf het moment dat er 1 method in een klasse abstract is MOET de klasse ook abstract zijn. Je kan dus een klasse hebben met 1000 methods die volledig gedefiniëerd zijn en daar 1 abstracte bij, dan moet de klasse abstract zijn.

  11. #9
    Gevorderd   Toelly's schermafbeelding
    Geregistreerd
    14 May 2009
    Locatie
    Sint-Niklaas
    Berichten
    341
    Bedankjes
    72
    Bedankt
    677 keer in 257 posts
    Maar wat is dan het nut van een abstracte methode? Overal waar die voorkomt in een subklasse (ge-extend met de abstracte klasse) moet je die methode toch nog helemaal definiëren. Daar zit dus toch helemaal geen winst in?
    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987

  12. #10
    Erelid/Spyware Slayer  
    Geregistreerd
    10 May 2005
    Berichten
    1.977
    Bedankjes
    119
    Bedankt
    373 keer in 248 posts
    Je kan die abstracte klasse door verschillende klasse laten extenden en die method telkens op een andere manier laten definiëren, als je die abstracte method weg laat uit de abstracte klasse is het geen abstracte klasse meer en kan je hem gewoon gebruiken, maar het probleem is dat die klasse dan nog niet helemaal klaar is. De abstracte method MOET door klasse die de abstracte klasse willen extenden gedefiniëerd worden.

    Het is moeilijk om alle functionaliteit van Object geörienteerd programmeren te begrijpen door uitleg te lezen, je moet alles zelf eens proberen en gebruiken, na een tijd zie je vanzelf de verschillen en de voor-en nadelen van al de verschillende technieken.

    Hopelijk begrijp je het met die voorbeeld:
    We hebben 1 abstracte klasse die we 'gegevens' noemen, we kunnen onze gegevens echter op verschillende manieren opslaan, in een database en in een bestand.
    We extenden dus onze 'gegevens'-klasse en krijgen twee nieuwe klasse: 'gegevensDB' en 'gegevensBestand'. Deze klasse doen hetzelfde (ze leveren ons gegevens die we nodig hebben in ons programma, maar ze doen dit op een verschillende manier).

    In onze abstracte klasse hebben we een array, en een aantal get-methods, deze zijn voor beide hetzelfde (we hebben immers dezelfde gegevens). Daarna maken we nog een abstracte method leesGegevens(), deze is voor beide anders, de ene leest zijn gegevens uit een database, de andere uit een bestand.

    In onze twee 'final' klasse definiëren we nu de method leesGegevens(). Nu lijkt het gebruik van de abstracte method nog zinloos maar kijk:
    In ons programma kunnen we nu het volgende doen:

    Code:
    gegevens mijnGegevens; // we hebben hier een variabelen gemaakt van het type mijnGegevens, we hebben de klasse NIET geinstancieerd!
    
    // Nu kunnen we verder in de code bepalen of we gegevens uit de database willen of we deze gegevens uit het bestand willen:
    // Als we gegevens uit de database willen doen we dit:
    mijnGegevens = new gegevensDB( );
    // Willen we de gegevens uit het bestand dan doen we dit
    mijnGegevens = new gegevensBestand( );
    
    // Nu willen we de gegevens gaan inlezen, we gebruiken de method leesGegevens( ) hiervoor, nu hoeven wij ons niet meer aan te trekken van waar de gegevens komen, we roepen gewoon de method leesGegevens( ) aan, als we eerder gekozen hebben voor gegevensBestand zal de method uit gegevensBestand aangeroepen worden en worden de gegevens uit het bestand gehaald, idem voor de database.
    mijnGegevens.leesGegevens( );
    
    // Hier kunnen we met de gemeenschappelijke get-methods gegevens uit onze klasse halen.
    // Dit mag omdat gegevenDB en gegevensBestand child-klasse zijn van gegevens.
    We doen hier dus hetzelfde, maar op twee verschillende manieren zonder dat we er veel rekening mee hebben moeten houden.

Discussie informatie

Users Browsing this Thread

Momenteel bekijken 1 gebruikers deze discussie. (0 leden en 1 gasten)

Soortgelijke discussies

  1. sun java JRE 6.0.70.0
    Door dannyma in forum Internet
    Reacties: 12
    Laatste bericht: 11 September 2008, 23:32
  2. ???java???
    Door kingtommyboy in forum Webdevelopment & Programming
    Reacties: 7
    Laatste bericht: 1 August 2006, 21:49
  3. Abstracte Wallpapers
    Door Nikolas in forum Tips & Trucs
    Reacties: 0
    Laatste bericht: 4 June 2006, 15:36
  4. Java
    Door Rosty in forum Overige software
    Reacties: 4
    Laatste bericht: 24 April 2006, 20:56
  5. Java
    Door TusH in forum Overige software
    Reacties: 3
    Laatste bericht: 1 November 2005, 20:37

Favorieten/bladwijzers

Favorieten/bladwijzers

Regels voor berichten

  • Je mag geen nieuwe discussies starten
  • Je mag niet reageren op berichten
  • Je mag geen bijlagen versturen
  • Je mag niet je berichten bewerken
  •