OOP - Dedeni s vice tridama – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

OOP - Dedeni s vice tridama – PHP – Fórum – Programujte.comOOP - Dedeni s vice tridama – PHP – Fórum – Programujte.com

 

Ruda0
Newbie
15. 7. 2008   #1
-
0
-

Zdravim,
Rad bych Vas porprosil o malou radu.. Mam 3 tridy a muzou jich byt i vice.. Prvni tridu mame napriklad

1) class - A
2) class - B
3) class - C

Jde o to ze potrebuji do tridy class - B odkazovat funkce z tridy A a C .. Priklad (je to jen pro ilustraci)
A.class.php



<?php
class A
{
function GetName($name)
{
return $name;
}
}
?>


C.class.php


<?php
class C
{
function ReplaceSpace($value)
{
return $value;
}
}
?>


$ClassA = new A();
$ClassB = new C();

B.class.php


<?php
class B extends A
{
public $name = "Ruda ";
function Write()
{
echo parent::GetName($name);
echo parent:: ReplaceSpace($name); <- Tohle bych potreboval dedit z tridy C
}

}
?>

$ClassB = new B();
$ClassB->Write();


Ted se asi nakytuje vyuziti rozhrani, ale bouzel nejak na to nemohu prijit? Koukal jsem na net a do knizky.. Dekuji za vysvetleni..

Nahlásit jako SPAM
IP: 195.113.177.–
bukaj0
Věrný člen
15. 7. 2008   #2
-
0
-

Ruda
PHP vícenásobnou dědičnost nepodporuje, takže toto nelze. Rozhraní slouží k něčemu jinému. Uvažuje se o zavedení tzv. "traits" (http://wiki.php.net/rfc/traits), ale to je ještě (a zdá se mi, že daleká) budoucnost. (Pozn. A stejně bych neřekl, že by traits bylo až takové vítězství. Zavést rovnou vícenásobnou dědičnost by bylo nejspíš jednodušší. (Jednodušší z hlediska programátora, který v PHP pracuje, ale zase nevím, jak je to udělané ve střevech PHP, takže by její implementace nemusela být až tak jednoduchá.))

Budeš muset svůj problém vyřešit jinak. A neříkej, že to jinak nejde, že to takhle prostě potřebuješ, nejspíš to půjde jinak ;o) Na tomhle modelovém příkladu avšak nejde říci jak.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Ruda0
Newbie
16. 7. 2008   #3
-
0
-

To bukaj : Ano tak jak pisu to potrebuji a nebo asi takhle.. Mas nejakou tridu A ktera dedi od tridy B a zaroven potrebujes jeste neco z tridy C.. Ve tride C budes mit veskere funkce pro praci s textem.. Jak docilis toho aby jsi mohl pouzit funkce z tridy C ve tride A kdyz dedi z tridy B? Snad uz je to vice jasne oc mi jde :-) ..Dekuji

Nahlásit jako SPAM
IP: 88.103.125.–
Tomcat0
Newbie
16. 7. 2008   #4
-
0
-

Jak uz zde bylo receno, PHP nema vicenasobnou dedicnost (coz je mimochodem mozna spis dobre). Jednim z moznych reseni je udelat, ze napr. C dedi z B a to dedi z A (zas to ale musim mit hlavu a patu trosku teda :)). Tim v C ziskas funkce tech ostatnich dvou. Dalsi mozne reseni je mit C dedici z B a na A pouze uchovavat referenci a vytvorit v C odpovidajici funkce z A a prevolavat jejich implementaci na A (zni to uchylne ale pouziva se to - je pekne, ze muzes ovlivnit co "podedis").

Nahlásit jako SPAM
IP: 62.24.93.–
"Nemůžete nikoho nic naučit, můžete mu maximálně pomoci, aby to sám v sobě nalezl. " Galileo Galilei
Ruda0
Newbie
16. 7. 2008   #5
-
0
-

To Tomcat : Myslis ze by jsi mi mohl uvest jednoduchy nazorny priklad? Dik

Nahlásit jako SPAM
IP: 88.103.125.–
bukaj0
Věrný člen
16. 7. 2008   #6
-
0
-

Ruda
Mas nejakou tridu A ktera dedi od tridy B a zaroven potrebujes jeste neco z tridy C..
Ne, co tu popisuješ je pořád vícenásobná dědičnost. Nebo druhou možností je potřeba použít, jak navrhoval Tomcat, vysoký strom, kdy jedna třída dědí z druhé. Ale věř mi, že obojí většinou pramení ze špatného designu. Dalo by se říci, že dědičnost je největší silou OOP, když ji využíváš správně, ale zároveň i největší slabinou, pokud ji používáš špatně.

Ve tride C budes mit veskere funkce pro praci s textem..
Pak nechápu, proč by A měla dědit z C. Dědění je proces, při kterém by se potomci měli specializovat, či doplňovat nějakou vlastnost rodiče. Musíš si uvdomit, že dědění neslouží jen ke sdílení metod.

Dobře, řekněme, že třída C obsahuje funkce (lépe řečeno poskytuje metody; pokud vidíš třídu jenom jako obal na funkce, radši se vrať normálně k procedurálnímu programování) pro práci s textem. Jestli obsahuje tyto funkce, pak doufám, že do ní nerveš ještě něco jiného. C tedy obsahuje funkce pro práci s textem a nic jiného než funkce pro práci s textem. Potom je blbost, aby A, která chce metody C jenom využívat, ale ne je nijak vylepšovat, měnit atp., z C dědila.

Nejjednodušší asi bude, když všechny metody C nadefinuješ jako statické. V A pak budeš volat C::metoda($param1, $param2, ..., $paramN); A jak vidíš, vícenásobnou dědičnost nepotřebuješ.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Ruda0
Newbie
16. 7. 2008   #7
-
0
-

To bukaj : to co jsem uvadel byl jenom priklad samodrejme ze nemam zadnou tridu pro praci s textem jen jednoducha ukazka oc mi asi tak nejak slo. Dedit bouzel potrebuji a udelam si na to rozhrani coz asi i k tomu nejak tak slouzi. procedurálnímu programování nemam rad.. Dekuji za vysilujici komentare budu patrat nekde jinde.. Jeste jednou dekuji..

Nahlásit jako SPAM
IP: 88.103.125.–
bukaj0
Věrný člen
16. 7. 2008   #8
-
0
-

Ruda
Dedit bouzel potrebuji a udelam si na to rozhrani coz asi i k tomu nejak tak slouzi.
Rozhraní ti v tomto případě nijak nepomůže. Rozhraní neslouží ke sdílení kódu. Třída, která nějaké implementuje, se pouze zavazuje, že metody deklarované v rozhraní bude podporovat.

Možná, pokud neděláš nějakou strašně tajnou špiónskou věc :o), by stálo za to, aby ses podělil konkrténě, oč ti jde. Pak by se nad tím rozhodně líp uvažovalo než nad takovýmhle modelovým příkladem.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Tomcat0
Newbie
16. 7. 2008   #9
-
0
-

Ruda napsal:
To Tomcat : Myslis ze by jsi mi mohl uvest jednoduchy nazorny priklad? Dik



<?php

class A {
function aa() {
echo 'a';
}
}

class B extends A {
function ba() {
echo 'b';
}

}

class C extends B {
function ca() {
echo 'c';
}

}

$c = new C();
$c->aa();
$c->ba();
$c->ca();
?>

Nahlásit jako SPAM
IP: 62.24.93.–
"Nemůžete nikoho nic naučit, můžete mu maximálně pomoci, aby to sám v sobě nalezl. " Galileo Galilei
Ruda0
Newbie
17. 7. 2008   #10
-
0
-

Ahoj,To Tomcat : Dekuji za ukazku, ale pozdeji jsem si uvedomil ze nepotrebuji dedeni.. Blbe jsem si stanovil praci.. Slo mi vlastne jen o vytvoreni staticke tridy s kterou mohu pristupovat do jakekoliv tridy bez nutnosti ji dedit jelikoz to neni vubec potreba.. Ale dik za rady urcite se mi budou take hodit..

Nahlásit jako SPAM
IP: 88.103.125.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý