Private property a není možnost dědění
- Myiyk
- Člen | 321
Zdravím,
momentálně nejsou možné úpravy pomocí dědění některých věcí
v nette. A to z jednoduchého důvodu, nachází se tam private
property.
Příklad Nette\Database\Drivers\MySqlDriver,
kde je $connection
jako private. Pokud si to zdědím a něco
upravím, už se nedostanu ke $connection.
Z jakého důvodu se nepoužije protected
?
- Jan Tvrdík
- Nette guru | 2595
Můžeš si přetížit konstuktor, ale v tomto konkrétním případě by
protected
asi nevadilo. Pošli pull request. Obecně ale není
možné nahradit všechny private
properties za
protected
.
- chloris
- Člen | 23
mystik napsal(a):
Problém je že v okamžiku, kdy se to udělá protected tak se to stane součástí rozhraní a každá změny by byl BC break. To by ohromně ztížilo další vývoj, pokud by se to bez rozmyslu dělalo všude.
Mohu poprosit o nějaké konkrétnější vysvětlení? Zatím to chápu tak, že pokud z třídy oddědím a vnitřně se pak třeba změní názvy těch protected členů v předkovi, tak moje třída, která k nim přistupovala, přestane fungovat. Kdežto pokud budou private, po oddědění k nim přistoupit nemohu a jsem tedy „chráněn“ před případnou změnou názvu / odebrání :-). Nebo je v tom ještě něco jiného?
Nicméně pokud se podívám například na třídu Nette\Database\Context, tak má:
<?php
/** @var Connection */
private $connection;
/** @var IStructure */
private $structure;
/** @var IConventions */
private $conventions;
?>
takže odděděním se k nim nedostanu, ale mohu při dědění stejně využít gettery definované v předkovi:
<?php
/** @return Connection */
public function getConnection()
{
return $this->connection;
}
/** @return IStructure */
public function getStructure()
{
return $this->structure;
}
/** @return IConventions */
public function getConventions()
{
return $this->conventions;
}
?>
jsou tedy i zde private potřebné? Nebo například zde by mohly být
protected, abych nemusel volat getter, ale mohl přistoupit přímo?
Díky :-)
Editoval chloris (1. 12. 2015 11:58)
- David Matějka
- Moderator | 6445
souvisi to i se zapouzdrenim, aby treba potomek nemohl nejak nehezky a nekonzistentne prepsat ty hodnoty.