Autor Zpráva
Orlando
Profil *
Ahoj, dejme tomu, že mám 3 x class a potřeboval bych se mezi nima pohybovat v tom smyslu, že budu mít s každé této class přístup do každé class a to jak volat metody tak i přístup do proměnných. Něco takového bych potřeboval, ale funkčního ;-) Poradí někdo? Díky
class Syn extends Tata {

     private $syn = "syn";

     public function __construct()
     {
          // ??? Přepiš proměnnou $tata v class Tata
          // ??? Přepiš proměnnou $dcera v class Dcera
     }
}

class Dcera extends Tata {

     private $dcera = "dcera";

     public function __construct()
     {
          // ??? Přepiš proměnnou $tata v class Tata
          // ??? Přepiš proměnnou $syn v class Syn
     }
}

class Tata {

     private $tata = "tata";

     public function __construct()
     {
          $this->obj1 = new Syn();
          $this->obj1 = new Dcera();
          // ??? Přepiš proměnnou $syn v class Syn
          // ??? Přepiš proměnnou $dcera v class Dcera
     }
}

new Tata();
Joker
Profil
Orlando:
Nebyl by nějaký lepší nadpis?

Co se týká otázky, záleží na tom, jaký to má mít smysl. Vhodné řešení musí odpovídat účelu.
Ale obecně jsou dva způsoby, jak dostat funkčnost nějaké třídy do jiné třídy: Skládání a dědění.
juriad
Profil
Orlando:
Jedna z největších výhod objektového programování je možnost definovat pevné rozhraní k datům; a to se právě snažíš porušit.

<?php
abstract class Osoba {
        private $jmeno;
        private $otec;
        private $matka;
        private $pohlavi;
        protected $deti;
        protected $ziva;

        protected function __construct($jmeno, $pohlavi, $otec, $matka) {
                $this->jmeno = $jmeno;
                $this->pohlavi = $pohlavi;
                $this->ziva = true;
                $this->deti = array();

                $this->otec = $otec;
                if($otec != null) {
                        $otec->deti[] = $this;
                }

                $this->matka = $matka;
                if($matka != null) {
                        $matka->deti[] = $this;
                }
        }

        public function getJmeno() {
                return $this->jmeno;
        }
        public function getPohlavi() {
                return $this->pohlavi;
        }
        public function getOtec() {
                return $this->otec;
        }
        public function getMatka() {
                return $this->matka;
        }
        public function getDeti() {
                return $this->deti;
        }
        public function jeZiva() {
                return $this->ziva;
        }
}

class Zena extends Osoba {
        public function __construct($jmeno, $otec, $matka) {
                parent::__construct($jmeno, 'zena', $otec, $matka);
        }

        public function splod(Muz $muz, $jmeno, $pohlavi) {
                if(!$this->jeZiva() || $muz == null || !$muz->jeZiva()) {
                        throw new Exception("Nekrofil");
                }
                switch($pohlavi) {
                        case 'zena':
                                $dite = new Zena($jmeno, $muz, $this);
                                break;
                        case 'muz':
                                $dite = new Muz($jmeno, $muz, $this);
                                break;
                        default:
                                throw new Exception("Spatne pohlavi");
                }
                return $dite;
        }
}

class Muz extends Osoba {
        public function __construct($jmeno, $otec, $matka) {
                parent::__construct($jmeno, 'muz', $otec, $matka);
        }

        public function vytvorZZebraZenu($jmeno) {
                if(!$this->jeZiva()) {
                        throw new Exception("Zebro uz nefunguje");
                }
                return new Zena($jmeno, null, null);
        }

        public function zabij(Osoba $osoba) {
                if(!$this->jeZiva()) {
                        throw new Exception("Mrtvy nemuze zabit");
                }
                $osoba->ziva = false;
        }
}

$adam = new Muz('Adam', null, null);
$eva = $adam->vytvorZZebraZenu('Eva');

$kain = $eva->splod($adam, 'Kain', 'muz');
$abel = $eva->splod($adam, 'Abel', 'muz');

$kain->zabij($abel);
Orlando
Profil *
Ano, napsal jsi to zcela správně, "Jedna z největších výhod objektového programování je možnost definovat..." a já tuto možnost nechci využít ;-)
Tori
Profil
Orlando:
A co je účelem / cílem? Jaké entity představují ty 3 třídy? Je vůbec nutné, aby dvě z nich byly potomky třetí?

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:

0