ugrás a tartalomhoz

PHP baráti osztályok vagy ilyesmi

kemmma · 2012. Jan. 13. (P), 15.20
Sziasztok, az a baj, hogy pontosan nem is tudom, hogy mit szeretnék, emiatt a Google egyelőre nem barátom... :(

Adott egy nagy osztály, benne több private tagfüggvénnyel. Egy átalakítás során viszont ezt szét kellene szedni több osztállyá. A bővíthetőség miatt néhány funkciót le kell választani. (az átalakítás után azt szeretném, hogy egyes funkciókat a Stratégia tervezési minta alapján külön osztályok felügyeljék)

A problémám, az új osztályok ne legyenek az eredeti osztály gyermekei, de néhány private függvényre mégis szükség lenne. Jelenleg ezt csak úgy tudtam orvosolni, hogy minden 1. átadom az eredeti objektumot, ez mondjuk nem is baj, 2. az összes private-ből public-ot csináltam, na ez nem tetszik.

class MyClass {
	public function __construct () {
		$a = new StrategyA($this);
		$a->foo();
	}
	private function foo () {
		return 'foo';
	}
}
class StrategyA {
	private $owner;
	public function __construct(MyClass $owner) {
		$this->owner = $owner;
	}
	public function foo () {
		echo $this->owner->foo();
	}
}
new MyClass();
Java-ban van valami olyasmi, hogy egyik osztályban hozom létre a másik osztályt és akkor ott a privát változókat elérem, C++-ben van valami baráti osztály, PHP-ben van valami ilyesmi?

Remélem nem nagyon kusza amit írtam. Merre induljak el keresgélni?
 
1

Leszármazott

Poetro · 2012. Jan. 13. (P), 15.45
Mi a baj a leszármaztatással? És akkor használhatsz protected láthatóságot, azokhoz hozzáférhetsz, és felül is írhatod, de csak akkor, ha abból az osztályból származik az osztályod. Illetve használhatsz abstract osztályokat, hogy abból származtasd a tényleges osztályaidat, de mégis legyenek közös implementált metódusaik, illetve interface-eket, hogy definiálni tudj adni egy közös felületet az osztályaid között. Egyáltalán miért van szükséged a private tulajdonságokra?
2

Re: Leszármazott

kemmma · 2012. Jan. 13. (P), 16.04
A konkrét példa, amit összedobtam, csak a hibaüzenet előállítására szolgált, nem sokat gondolkodtam azon, hogy az mennyire valós lenne. (mindegy)

A probléma, hogy az osztály kinőtte magát és emiatt át kell alakítani. Számomra a megfelelő átalakítás meg nem a specializálás, hanem részfeladatok leválasztása. Erre keresek valami olyan opciót, mint a Java nyelvben a beágyazott osztályok. Vagy ennek valami szimulációja.
3

package scope-nak hívják

tgr · 2012. Jan. 13. (P), 19.18
package scope-nak hívják Java-ban, amire gondolsz, és nincs PHP-s megfelelője (sajnos). PHP 5.4-ben a traiteket tudod arra használni, hogy szétbonts egy osztályt, bár nem igazán ilyesmire találták ki őket. Vagy használhatsz valami konvenciót, pl. ami aláhúzással kezdődik, azt nem szabad a csomagon kívül használni (ezt csinálja pl. a Python). Meg lehet olyan gonosz trükköket használni, hogy pl. van az alaposztályod, amiben minden protected, és leszármaztatsz belőle egy osztályt, ami példányosításkor megkapja az alaposztály példányát, és ahhoz publikus hozzáférést nyújt, és ezt kapja meg a stratégia, de valószínűleg kevésbé fájdalmas mindent publikussá tenni.