Private property a není možnost dědění

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Myiyk
Člen | 321
+
0
-

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
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

@JanTvrdík Kdy třeba není možné použít protected?
Pokud chci změnit nějakou metodu v Connection, která používá/chci použít private property tak musím zkopírovat všechny metody, které tu property používají.
Nebo to jde jinak?

Editoval CZechBoY (6. 8. 2015 23:26)

mystik
Člen | 312
+
0
-

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.

chloris
Člen | 23
+
0
-

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
+
0
-

souvisi to i se zapouzdrenim, aby treba potomek nemohl nejak nehezky a nekonzistentne prepsat ty hodnoty.

CZechBoY
Člen | 3608
+
0
-

Nicméně v Db\Context není setConnection a kdybych třeba chtěl nastavil svoje PDO tak mám smůlu a musim forknout celou knihovnu.