PHP kôd:
abstract class Vozilo {
abstract protected function potrebnaDozvolaZaUpravljanje ();
abstract protected function brojTockova ();
abstract protected function potrebnaRegistracija ();
public function opis () {
echo get_class($this) . " sam ja, ";
echo $this->brojTockova() . " tocka imam... ";
if ($this->potrebnaDozvolaZaUpravljanje()) { echo "trebace ti dozvola... "; } else { echo "kakva dozvola? samo vozi!!! "; }
if ($this->potrebnaRegistracija()) { echo "mora da se registruje. "; } else { echo "kakva registracija, samo vozi... "; }
}
}
abstract class MotornoVozilo extends Vozilo {
public function potrebnaDozvolaZaUpravljanje () {
return true;
}
public function potrebnaRegistracija () {
return true;
}
}
class Bicikl extends Vozilo {
public function potrebnaDozvolaZaUpravljanje () {
return false;
}
public function brojTockova () {
return 2;
}
public function potrebnaRegistracija () {
return false;
}
}
class Automobil extends MotornoVozilo {
public function brojTockova () {
return 4;
}
}
class Motorcikl extends MotornoVozilo {
public function brojTockova () {
return 2;
}
}
i po meni, jedini proper način da se to uradi bez apstraktne klase
PHP kôd:
interface iVozilo {
public function potrebnaDozvolaZaUpravljanje ();
public function brojTockova ();
public function potrebnaRegistracija ();
}
class Vozilo implements iVozilo {
public function __construct () {
trigger_error('Not allowed', E_USER_ERROR);
}
public function potrebnaDozvolaZaUpravljanje () {
trigger_error('Implement this', E_USER_ERROR);
}
public function brojTockova () {
trigger_error('Implement this', E_USER_ERROR);
}
public function potrebnaRegistracija () {
trigger_error('Implement this', E_USER_ERROR);
}
public function opis () {
echo get_class($this) . " sam ja, ";
echo $this->brojTockova() . " tocka imam... ";
if ($this->potrebnaDozvolaZaUpravljanje()) { echo "trebace ti dozvola... "; } else { echo "kakva dozvola? samo vozi!!! "; }
if ($this->potrebnaRegistracija()) { echo "mora da se registruje. "; } else { echo "kakva registracija, samo vozi... "; }
}
}
class MotornoVozilo extends Vozilo {
public function potrebnaDozvolaZaUpravljanje () {
return true;
}
public function potrebnaRegistracija () {
return true;
}
}
class Bicikl extends Vozilo {
public function __construct () {}
public function potrebnaDozvolaZaUpravljanje () {
return false;
}
public function brojTockova () {
return 2;
}
public function potrebnaRegistracija () {
return false;
}
}
class Automobil extends MotornoVozilo {
public function __construct () {}
public function brojTockova () {
return 4;
}
}
class Motorcikl extends MotornoVozilo {
public function __construct () {}
public function brojTockova () {
return 2;
}
}
e sad, istina da u dinamičkom jeziku mož da se uradi i ovako, kako ti zagovaraš:
PHP kôd:
interface iVozilo {
public function potrebnaDozvolaZaUpravljanje ();
public function brojTockova ();
public function potrebnaRegistracija ();
}
class Vozilo {
public function __construct () {
trigger_error('Not allowed', E_USER_ERROR);
}
public function opis () {
echo get_class($this) . " sam ja, ";
echo $this->brojTockova() . " tocka imam... ";
if ($this->potrebnaDozvolaZaUpravljanje()) { echo "trebace ti dozvola... "; } else { echo "kakva dozvola? samo vozi!!! "; }
if ($this->potrebnaRegistracija()) { echo "mora da se registruje. "; } else { echo "kakva registracija, samo vozi... "; }
}
}
class MotornoVozilo extends Vozilo {
public function potrebnaDozvolaZaUpravljanje () {
return true;
}
public function potrebnaRegistracija () {
return true;
}
}
class Bicikl extends Vozilo implements iVozilo {
public function __construct () {}
public function potrebnaDozvolaZaUpravljanje () {
return false;
}
public function brojTockova () {
return 2;
}
public function potrebnaRegistracija () {
return false;
}
}
class Automobil extends MotornoVozilo implements iVozilo {
public function __construct () {}
public function brojTockova () {
return 4;
}
}
class Motorcikl extends MotornoVozilo implements iVozilo {
public function __construct () {}
public function brojTockova () {
return 2;
}
}
ali priznaćeš da to i nije baš identična funkcionalnost, i da je moguće napisati klasu koja se ne bi obavezala na ovaj interfejs, i ostavila neku od potrebnih metoda neimplementiranu, pa onda dolazimo do onih situacija da je PHP skrndelj zato što dozvoljava takve stvari, dok je problem zapravo između stolice i tastature