Springen naar inhoud

[java] klassen en subklassen


  • Log in om te kunnen reageren

#1

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 14 september 2011 - 18:51

Hallo,

Ik zit met volgend probleem. Om het eenvoudig te houden, zal ik het uitleggen aan de hand van een voorbeeld: stel je voor dat ik klasse Dier heb, en drie subklassen ervan: Hond, Kat, Koe. Ik run een kinderboerderij, en elk jaar wil ik een nieuw dier aankopen. Dat bepaal ik met een random generator, dat lukt.

Ik heb een functie Loop(), die voor elk van de dieren anders is.

Hoe kan ik nu zeggen 'neem het nieuw aangekochte beest, en laat zijn functie Loop() erop los'?

Ik had in de betreffende klasse eerst een variabele Dier mijndier aangemaakt, en dan een functie Dier getMijnDier(), maar deze geeft dus een Dier terug, en niet het juiste soort Dier.

Abstract kan ik de klasse dier niet maken, omdat er andere methoden in zitten die dat niet toelaten.

Alvast bedankt!
"C++ : Where friends have access to your private members." — Gavin Russell Baker.

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

ZVdP

    ZVdP


  • >1k berichten
  • 2097 berichten
  • VIP

Geplaatst op 14 september 2011 - 19:04

In een abstracte klasse hoeven niet alle methoden abstract te zijn, of had je een andere belemmering bij het abstract maken van Dier?
"Why must you speak when you have nothing to say?" -Hornblower
Conserve energy: Commute with a Hamiltonian

#3

317070

    317070


  • >5k berichten
  • 5567 berichten
  • Moderator

Geplaatst op 14 september 2011 - 19:09

1) maak Dier abstract (zoals ZvdP aangaf)
2) maak ook een functie in Dier, die een error throwed als die aangeroepen wordt.
What it all comes down to, is that I haven't got it all figured out just yet
And I've got one hand in my pocket and the other one is giving the peace sign
-Alanis Morisette-

#4

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 15 september 2011 - 07:07

Hoe kan ik nu zeggen 'neem het nieuw aangekochte beest, en laat zijn functie Loop() erop los'?

-- Test.java
public class Test {
		public static void main(String[] args) {
		Dier nieuwDier = geefEenDier();
		nieuwDier.Loop();
	}
	
	public static Dier geefEenDier() {
		return (new Konijn());
	}
}

-- Dier.java
public class Dier {
	public void Loop() {
		System.out.println("Ik beweeg op onbekende manieren.");
	}
}

-- Konijn.java
public class Konijn extends Dier {
	public void Loop() {
		System.out.println("Ik huppel alsof ik in het bos bent.");
	}
}
Deze code print: "Ik huppel alsof ik in het bos bent." Een konijnobject mag aan een dierreferentie geknoopt worden omdat konijn een subklasse is van Dier. Tijdens het uitvoeren wordt dan de loop-functie van het dierobject gezocht en dat is de loop() van het konijnobject. Je kan dus met het nieuwe dier aan de wandel zonder dat je code hoeft te weten wat voor dier het nou eigenlijk is. Dit is het hele punt van dit soort code. Als je moet uitvinden wat voor soort beest het is dan is er iets mis.

maak ook een functie in Dier, die een error throwed als die aangeroepen wordt.

Ik weet niet wat je precies van plan bent, maar het klinkt alsof je het exception-systeem van java aan het misbruiken bent voor iets waarvoor het niet bedoeld is.

#5

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 15 september 2011 - 20:31

Bedankt voor jullie reacties, nu heb ik het weer duidelijk voor ogen.
"C++ : Where friends have access to your private members." — Gavin Russell Baker.

#6

317070

    317070


  • >5k berichten
  • 5567 berichten
  • Moderator

Geplaatst op 15 september 2011 - 21:48

Ik weet niet wat je precies van plan bent, maar het klinkt alsof je het exception-systeem van java aan het misbruiken bent voor iets waarvoor het niet bedoeld is.

Gja, dat is de ivoren-toren-theorie. In de praktijk heeft men in Java zelfs een exception voorzien speciaal voor zulke situaties:

public void loop(){
††††† throw new UnsupportedException();
}

Als het met abstract kan, zeker doen. Als het niet met abstract kan, dan is dit volgens mij de beste manier. Ik ga zeker niet ontkennen dat je je structuur kunt aanpassen zodat je het alsnog kunt fixen (ik heb het hier zelfs even geprobeerd), maar dat is veel slechter voor je code, naar mijn mening.

Noot: loop() moet met een kleine letter!!!
What it all comes down to, is that I haven't got it all figured out just yet
And I've got one hand in my pocket and the other one is giving the peace sign
-Alanis Morisette-

#7

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 16 september 2011 - 07:02

Waarom geen gebruik maken van interfaces?
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#8

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 16 september 2011 - 07:21

Bericht bekijken

Waarom geen gebruik maken van interfaces?

Dat kan, maar dat lijkt me conceptueel niet juist.

#9

317070

    317070


  • >5k berichten
  • 5567 berichten
  • Moderator

Geplaatst op 16 september 2011 - 09:20

Zoals je daar kunt lezen wordt er gezegd dat het handig is als je moet omgaan met keuzes uit het verleden. Dat is hier niet aan de orde.

I beg to differ, als ik dan oplossingen zie als:
public void Loop() {
		System.out.println("Ik beweeg op onbekende manieren.");
	}
en de equivalente nachtmerries
public void Loop() {
		return;
	}
	public Object Loop() {
		return null;
	}
dan is dit volgens mij een one-way ticket richting een paar uur vrolijk debuggen. Als de functie niet verwacht wordt aangeroepen te worden, zorg dan dat ze niet bestaat. Als ze toch aangeroepen wordt omdat ze bestond om architecturale reden, dan is er iets mis en moet je een Exception throwen. Dan weet je in de toekomst meteen waar het probleem zit.

Interfaces lossen hier trouwens niets op, aangezien je dan Dier implements HeeftPoten hebt en dus niet verder bent gekomen.
What it all comes down to, is that I haven't got it all figured out just yet
And I've got one hand in my pocket and the other one is giving the peace sign
-Alanis Morisette-

#10

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 16 september 2011 - 09:33

I beg to differ, als ik dan oplossingen zie als:

Je verwart een voorbeeld om iets duidelijk te maken met een daadwerkelijke praktische situatie...

Als de functie niet verwacht wordt aangeroepen te worden, zorg dan dat ze niet bestaat.

Precies. En dat is dus precies waarom het gooien van een exception onzin is. Het is een symptoom van dat er iets mis is. Als je geen invloed hebt op de situatie, bijvoorbeeld omdat je werkt met al bestaande code, dan is het misschien een praktische oplossing. Als je die invloed wel hebt, bijvoorbeeld omdat je aan het ontwerpen bent, dan is het een slecht idee.

#11

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 16 september 2011 - 13:24

Dat je een exceptie throwt omdat een bepaalde method niet kan/mag aangeroepen worden in een bepaalde situatie is op zich niet zo fout in een service oriented design. Hier is daar uiteraard geen sprake van en kan het best vermeden worden. Anderzijds gaat het hier wel over overerving waar geen implementatie wordt overgeŽrfd, het valt dus zeker te overwegen om interfaces te gebruiken.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures