Objektum orientált programozás: ha két konstruktorom van, lehet-e az egyik által létrehozott objektumból kreálni egy másikat, úgy hogy az első adatai ne vesszenek el?
class Emberek
{
int hónap;
int nap;
public Emberek(int hónap, int nap)
{
this.hónap=hónap;
this.nap=nap;
}
public Emberek(int nap)
{
this.nap=nap;
}
Az objektumok emberek születésnap alapján jellemezve. Szeretnék írni egy metódust, ami viszont a születésnapjuk hónap-napban megadott dátumát átírja csak napokban megadottra, és azokból is objektumokat hoz létre, de fontos lenne, hogy az eredeti objektumok ne vesszenek el. Megtehetem-e?
Legyen inkább Ember.
A másik meg, hogy ha egyszer ennek hónap, nap adattagja van, akkor a másik OSZTÁLY nem lehet Ember.
Különben is számított adat, csinálj rá gettert.
Itt k_rva nagy félreértés van. Most leereszkedő magyarázatot fogok adni, így aki pontos szakmai definícióra várna, az nyugodtan görgessen tovább.
A konstruktor egy tárgynak a gyártási folyamatát írja le. De egy adott tárgy nem csak egy adott gyártási folyamattal készülhet el. Megadhatsz más gyártási folyamatokat is, amik ugyanazt a tárgyat állítják elő. Például, ha székeket akarunk gyártani, ahhoz kell ugye fa és szeg. De írhatok olyan gyártási folyamatot is a székhez, ami fémből és csavarokból állít elő széket. És mindkét esetben a termék ugyanaz lesz, azaz egy szék. Ez ugye így néz ki:
class Szék {
public Szék(Fa anyag, Szeg rögzítő) {...}
public Szék(Vas anyag, Csavar rögzítő) {...}
}
Szóval itt nem arról van szó, hogy az egyik konstruktorod legyárt egy tárgyat, és a másik konstruktor ezt a tárgyat módosítja. Egyébként van lehetőség arra, hogy az egyik konstruktorból (nevezzük "A" konstruktornak) meghívj egy másik konstruktort (nevezzük "B"-nek). Ezt akkor használod, ha az "A" konstruktor valamilyen adatok alapján előállítja a "B" konstruktornak szükséges adatokat. Ez azért lesz jó, mert nem fogod kétszer leírni ugyanazt:
class Ember {
public int Hó;
public int Nap;
public Ember(int Hó, int Nap) {
this.Hó = Hó;
this.Nap = Nap;
}
public Ember(int Napok) { //Itt azt kell megadni, hogy az év hányadik napján született az illető.
int Hó = Napok / 31; //Feltesszük, hogy minden hónap 31 napos.
int Nap = Napok % 31;
this.Hó = Hó; //Mint láthatod, ezt a két sort már egyszer leírtuk, miért tegyük meg kétszer?
this.Nap = Nap;
}
}
Ennek egy egyszerűbb változata ez (C# példa):
class Ember {
public int Hó;
public int Nap;
public Ember(int Hó, int Nap) {
this.Hó = Hó;
this.Nap = Nap;
}
public Ember(int Napok) : this(Napok / 31, Napok % 31) {}
}
Kicsit pontosítok az előzőn. A konstruktor nem gyárt semmit. A konstruktor nem több, mint az a függvény, ami legelőször fut le egy objektum létrehozásakor (megspékelve néhány extra jogosultsággal, mint readonly tagok beállítása). Nem hoz létre semmit. Csak a már létrehozott objektumon lehetőséget ad beállítani a kezdeti tulajdonságait. (más szóval inicializálni)
Ami létrehoz egy új objektumot, az a new kulcsszó. Aztán az objektumra exkluzívan lefut EGY konstruktor, EGYSZER. Szóval nem fogsz konstruktorral belenyúlkálni később, mert arra az objektumra nem fog többé konstruktor futni. Ha akarsz egy metódust ami a hónap-nap formában megadott születésnapot átalakítja napban megadottra (ami mondjuk a szökőévek miatt szerintem élből értelmetlen), akkor azt csinálhatod többféleképpen. Írhatsz egy Emberek visszatérési értékű függvényt, ami egy Emberek típusú paramétert kap, és a hónap/nap értékekből kikalkulálja a napok számát, és a megfelelő konstruktor használatával létrehoz egy új objektumot. (new Emberek(napokSzama))
Vagy mondhatod azt, hogy eleve új konstruktorral oldod meg, ami egy Emberek típusú paraméterből állítja be a kezdőértékeket
(public Emberek(Emberek minta))
De a legjobb az lenne, ha nem kevernéd a szezont a fazonnal, és inkább új adattagként tárolnád el az osztályban a napok számát. Mert elég katyvasz, ha ugyanaz a "napok" adattag néhol a hónap napját, máshol az év napját tárolja. Ezt szeparáld valamilyen módon.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!