Kezdőlap › Fórumok › Programozás › Kérdéses objektumszerkezet
- This topic has 7 hozzászólás, 3 résztvevő, and was last updated 19 years, 3 months telt el by
pointux.
-
SzerzőBejegyzés
-
2006-03-14-17:51 #2052969
Javaslom az inheritance (öröklés) címszó alatt található adatok tanulmányozását…
„B leszármaztatható A-ból, de semelyik Ax-bõl.”
class B : public A – B örökli A összes tagfüggvényét, úgy ahogy van
class Ax : private A – az öröklött tagok priváttá válnak, tehát class C : public Ax esetén sem érheti el C az A tagjait, az Ax tagjait, pedig csak akkor, ha azok nem private-tal vannak deklarálva.Akármi (A) felülírása (B-ben):
class A…
virtual … akarmi…
…
class B : …. A
… akarmi …
…
(polymorphism)2006-03-14-21:37 #2052970Szerintem nem kell, de a hasonló megoldások elkerülése végett jelzem, hogy – sajnos – PHP-ben kellene kódolni (4.3), ahol csak publikus osztályelemek és öröklés van. A leszármaztatás folyamán minden öröklõdik, maximum felülírható.
De attól tartok, a problémámra a részleges öröklés sem lenne megoldás, hisz tömören azt szeretném, hogy bármelyik A1, A2, A3 osztálynál meg lehessen adni, hogy A-ból vagy B-bõl származzon – anélkül, hogy két osztálydefiníciót kellene létrehozni. (Késõbb persze C-, D-, E-bõl). Vagyis Ax definíciója során egy elkõre nem ismert – de A-ból származó – osztálytól kellene származnia. Persze a helyes mûködéshez elég A-ból származtatni, de ezt késõbb lehessen megváltoztatni – új jellemzõk eléréséhez.
Erre persze nincs nyelvi lehetõség, ezért ennek szimulációjára, vagy helyes alternatív kódolására vagyok kíváncsi.2006-03-15-11:27 #2052971„Erre persze nincs nyelvi lehetõség, ezért ennek szimulációjára, vagy helyes alternatív kódolására vagyok kíváncsi.”
Hát ha ezt nem lehet megcsinálni, akkor szívás… én nem tudom (tudtam), php-ben soha nem akartam ilyet csinálni…2006-03-15-13:02 #2052972Szerintem ezt nem csak PHP-ben nem lehet megcsinálni, hanem általában nem. Legalábbis azon nyelvekben nem, ahol egy osztály csak egynek lehet a leszármazottja, ráadásul, hogy melyiké, az fordítási idõben dõl el. (Talán még a Java sem tud futásidõben osztáyldefiníciót létrehozni … de azért ebben nem vagyok biztos. De ha tudna a serializációval lenne rendesen problémája! 🙂
Kényszermegoldásként létrehoztam egy külön property-t az A osztályban, s a változó mûveleteket ennek a propertynek a mûveleteivé tettem. Igaz, mivel az eredeti objektum egyéb mûveleteire is szükség van, ezért minden kiemelt mûvelet megkapja az eredeti objektumot is paraméterként.
2006-03-15-15:43 #2052973„Talán még a Java sem tud futásidõben osztáyldefiníciót létrehozni … de azért ebben nem vagyok biztos.”
Amíg c++-ban, ahhoz, hogy futásidõben jöjjön létre az osztály, ahhoz a virtual szó kell, amíg javaban eleve minden dinamikus, ezért soha nem kell virtual (hacsak nem static) – ez egyébként az összes modernebb nyelvben így van, de a c elég ódivatú -…. ezért tûnhet úgy, hogy nem tudja, pedig, de 🙂
class szam {…}
class egy extends szam {…}
class ketto extends szam {…}szam[] sz = new szam[2];
sz[1] = new egy();
sz[2] = new ketto();Fordításkor ebben az esetben nem lehet tudni, hogy melyik tag függvény hívódjon meg (…).
Az pl nem tudom php-ben van-e, de javaban a super-rel meg lehet hívni a szülõ azonos függvényét…
Az igaz egyébként, hogy javaban nincs többszörös öröklõdés (problémák elkerülése végett vették ki), de implementáció van… ennek elvileg php-ben is mennie kell:
pl:
public abstract class allat {
public void eszik() {
//… állateszik…
}
}public interface harcos {
public void harap();
public void karmol();
}public interface szelid {
public void baratsagos();
}class kutya extends allat implements harcos {
public void eszik() {
// … ez már kutyaeszikeszik, megint csak futás idõben…
}
}
class vadmacska extends allat implements harcos…
class hazimacska extends allat implements szelid…Szóval szerintem ennek a struktúrának elegendõnek kell lennie… 🙂 (Talán segített ez a kis példa.)
2006-03-22-09:40 #2052974Köszi szépen!
Sajna a PHP-ban interface sincs. A super-nek van megfelelõje, de az is csak objektumokon mûködik, osztályfüggvényeken nem. 🙂
Hát, mindegy. Lassan megbarátkoztam a helyzettel. … 🙂2006-03-22-13:19 #2052975Pedig ennek a kódnak menni kell php alatt is (azt nem tudom ugyan, hogy milyen verzióval)… esküszöm tele van vele a net.
(Egyébként, ha mégsem – ami kizárt -, akkor miért ragaszkodsz a php-hez, van java? Vagy azzal nem lehet megoldani? Vagy frissíteni kéne.)„A super-nek van megfelelõje, de az is csak objektumokon mûködik, osztályfüggvényeken nem”
Persze annak az a lényege, hogy a szülõ ugyanolyan nevû függvényét el lehessen érni…2009-12-04-19:57 #1882703Egy objektumorientált programba többszörös öröklõdésre lenne szükségem, amit persze nem tud a nyelv.
Hogyan lehetne szépen, korrektül megoldani?
A helyzet:
Van egy A osztályom. Ebbõl származik rengeteg A1, A2, A3, … osztály. Továbbá van egy új B osztályom, melynek szeretném, ha ugyanazon leszármazottai meglennének, mint A-nak. B leszármaztatható A-ból, de semelyik Ax-bõl. B csak A némely metódusát definiálja felül, és ezeket kellene csak felüldefiniálni minden más A-ból származóban is.
Kényszerbõl delegálással próbálkoztam, de az sem tûnik jó megoldásnak, ugyanis a felüldefiniált mûveletek nem zártak, azaz más metódusokat használnak, melyeket B nem definiál felül, tehát mindig az aktuális objektum mûvelete kellene, hogy lefusson.
… -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz