Autor Zpráva
MaK
Profil
Mám třídu A, třídu B a funkci getRoot:
class A 
{ 
  public function x() {}  
}

class B extends A 
{ 
  public function x() {}  
  public function y() {}  
}

/**
 * @return A 
 */
function getRoot()
{
  // vrací instanci třídy A nebo B
}

Toto mohu určitě, o tom není sporu:
getRoot()->x();

Ale mohu si dovolit toto?
getRoot()->y();

Samozřejmě mohu si vypomoci berličkou:
$r = getRoot();
if ($r instanceof B)
  $r->y();

Ale není takový přístup v rozporu s objektovým programováním?

MaK
nightfish
Profil
MaK:
Ale mohu si dovolit toto?
getRoot()->y();
Pokud getRoot() vrací instanci A, tak nedává smysl volat y().

Samozřejmě mohu si vypomoci berličkou:
Ale není takový přístup v rozporu s objektovým programováním?
Tady by se lépe radilo s konkrétním problémem, možná by šel objektový návrh vytvořit jinak/lépe.
MaK
Profil
nightfish:
Funkce getRoot() může vrátit instanci třídy A nebo instanci třídy B (B je potomek A).

Myslím, aby to bylo košér, měla by být funkce y() definována již v bázové třídě A.
Zdá se mi podivné, zjistit si typ třídy a podle toho volat funkci, která není v předcích obsažena.

MaK
Radek9
Profil
MaK:
Pokud má smysl, aby třída A měla metodu y, pak ano. Ale jak říkal nightfish, lepší by bylo popsat konkrétní problém. Na tom ti můžeme poradit lépe.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: