Kezdőoldal » Számítástechnika » Programozás » Ez hogyan lehetséges a program...

Ez hogyan lehetséges a programozásban?

Figyelt kérdés
Ha van egy "Kutya" osztályom és két példányom belőle, hogyan tudom őket szaporítani, hogy legyenek "Kiskutya" -k?
2015. márc. 23. 21:37
 1/10 anonim válasza:

Nem egészen értem, hogy mit akarsz csinálni :D

Esetleg úgy tudom értelmezni a kérdést, hogy azt szeretnéd, hogy a főosztályból(Kutya) olyan osztályokat akarsz létrehozni, amelyek bizonyos tulajdonságokat megtart a főosztályból, másokat meg akár módosít, akkor egyszerűen az új osztályt(Kiskutya) a főosztály alosztályaként kell létrehoznod.

2015. márc. 23. 21:42
Hasznos számodra ez a válasz?
 2/10 anonim ***** válasza:
Oroklest kell megvalositanod csinalsz egy kiskutya osztalyt, ami orokli a kutya osztaly tulajdonsagait esetleg meg lesznek mas tulajdonsagai, tagfuggvenyei es utana peldanyositod ezt az osztalyt es keszen is vanak a kiskutyak...
2015. márc. 23. 21:54
Hasznos számodra ez a válasz?
 3/10 anonim ***** válasza:
100%

Én így képzelem el:


class Kiskutya {


private Kutya apa, anya;


public Kiskutya(Kutya apa, Kutya anya) { this.apa=apa; this.anya=anya; apa.getGyerekek.add(this); anya.getGyerekek.add(this);


}


class Kutya {


private List<Kiskutya> gyerekek; // +getter

}


De igazából felesleges a Kiskutyára külön osztály, hiszen abból egyszer nagy kutya lesz ugyanúgy. A "kiskutyaság" inkább egy állapot legyen a Kutyában. (Mondjuk egy boolean adattag.)

2015. márc. 23. 22:12
Hasznos számodra ez a válasz?
 4/10 A kérdező kommentje:
Köszönöm mindenkinek, úgy gondoltam ahogy a 3# -ik válaszoló írta így neki külön kösz.
2015. márc. 23. 22:23
 5/10 anonim ***** válasza:
#3: Ez nagyon nem jó ötlet. A "this" referenciát nem illik átadni. Ezen felül a gyerekek private (ne is legyen public). Akkor inkább legyen egy createChild metódusa a Kutya osztálynak, amely létrehoz egy új példányt, beregisztrálja a másik szülőnél is, majd az adott "kiskutyát" visszaadja.
2015. márc. 24. 02:25
Hasznos számodra ez a válasz?
 6/10 anonim ***** válasza:
Ezt egyértelműen örököltetni kell, hogy értelme legyen, de több nyelvben tiltott a többszörös öröklés.
2015. márc. 24. 14:42
Hasznos számodra ez a válasz?
 7/10 anonim ***** válasza:

Ebben annyira nem lehetünk biztosan. Maga a kérdés nem egyértelmű. Hogy jön az objektumorientáltság kontextusában értelmezett öröklődéshez a szaporítás? Most akkor mit is szeretne a kedves kérdező? Kutyaszaporítást szimulálni? Vagy a technikai értelemben vett öröklődésről kérdezne? Egy biztos, az OOP öröklődés-koncepciójának az égvilágon semmi köze nincs a biológiai gyermek-szülő viszonyhoz, öröklődéshez. Sajnos ezt nagyon sok helyen rosszul oktatják.


Ha visszatérünk a kutyaszaporítás szimulációjára, a kutya, az kutya (Hehe, Esőember :D). Semmi értelme nincs külön osztály létrehozni az utódoknak és pláne nem szabad összemosni a szaporítást az OO leszármaztatással. Ezesetben (elnagyolva), valahogy így kellene kinéznie a dolognak:


public class Dog {

˙˙˙˙private final String name;

˙˙˙˙private final List<Dog> children = new ArrayList<Dog>();


˙˙˙˙public Dog(String name) {

˙˙˙˙˙˙˙˙this.name = name;

˙˙˙˙}


˙˙˙˙/*

˙˙˙˙˙* Ez akár Puppy-t is visszaadhatna Dog helyett,

˙˙˙˙˙* de annak itt nincs értelme. "A gatya, az gatya"

˙˙˙˙˙*/

˙˙˙˙public Dog breed(Dog otherParent, String name) {

˙˙˙˙˙˙˙˙Dog child = new Dog(name);

˙˙˙˙˙˙˙˙registerChild(child);

˙˙˙˙˙˙˙˙other.registerChild(child);

˙˙˙˙}


˙˙˙˙private void registerChild(Dog child) {

˙˙˙˙˙˙˙˙children.add(child);

˙˙˙˙}


˙˙˙˙public List<Dog> getChildren() {

˙˙˙˙˙˙˙˙return children;

˙˙˙˙}


˙˙˙˙@Override

˙˙˙˙public String toString() {

˙˙˙˙˙˙˙˙return name;

˙˙˙˙}

}


A #3 kolléga megoldását azért nem tartom szerencsésnek, mert egyrészt átpasszolja a this referenciát, másrészt explicit módon is körbereferálást hoz létre azáltal, hogy a szülőkben eltárolja az utódot, az utódban pedig a szülőket.


Ha egy kicsit jobban leírná, kifejtené a kérdező, milyen problémára keres megoldást, szerintem többet tudnánk segíteni...

2015. márc. 24. 15:29
Hasznos számodra ez a válasz?
 8/10 anonim ***** válasza:

#3 vagyok


#5/#7 kollégával nagyrészt egyetértek.


Az OOP öröklődésnek nincs köze a "szaporodáshoz", bármit is jelentsen. A többszörös öröklődés idekeverése pedig végképp irreleváns.


És aláírom, hogy az utóbbi kód elegánsabb, mint amit én tákoltam tegnap. Annyit tennék hozzá, hogy én egy percet sem fordítottam tegnap a gondolkodásra, szép kód kreálására, csak leírtam egy alap ötletet, amiből ki lehet indulni. Több volt amúgy a fejemben, pl. az addChild-ra gondoltam én is, de szimplán lusta voltam begépelni. És azt gondoltam/gondolom, ehhez a kérdéshez ez elegendő volt. :)


Amúgy miért rossz, ha kétirányú a navigáció "szülő" és "gyermek" között? :) (Azon kívül, hogy plusz 2 referenciának helyet kell foglalni objektumonként.) Szerintem bizonyos feladatoknál szükség lehet rá, hatékonyabb, hogy a gyerekből is elinduljunk felfelé a családfán.

2015. márc. 24. 15:58
Hasznos számodra ez a válasz?
 9/10 anonim ***** válasza:

"de szimplán lusta voltam begépelni"

Na végre, egy igazi kolléga! :D


A körkörös referencia többeközt a GC-nek okozhat problémát, de szemantikai duplikációnak is vehetjük a dolgot. Ráadásul körkörös dependenciát is eredményez a dolog, ha két osztályról beszélünk. Persze, a megoldásban, a kétirányú összerendeléshez szükséges volt, de ezesetben tényleg éredemesebb kiszervezni egy külön osztályba magát az összerendelést.

2015. márc. 24. 18:17
Hasznos számodra ez a válasz?
 10/10 anonim ***** válasza:
Értem, köszi! :)
2015. márc. 24. 19:08
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!