Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Jan Oktábec 10. 05. 2015, 15:20:06

Název: Prosím o radu s PHP OOP
Přispěvatel: Jan Oktábec 10. 05. 2015, 15:20:06
Mám problém s následujícím kódem. Místo provedení příkazu:

   echo "I need to do this operation :/...";

se zobrazí tato hláška:

   Fatal error: Call to private method B::fun1() from context 'A' in C:\Server\www\classproblem.php on line 6

Ačkoli kód vypadá nesmyslně (volání funkce fun1 v constructu objektu A, ačkoli funkce fun1 je v objektu B, který je potomkem objektu A), je v případě mého projektu nutností. Proč to nejde? Mám místo $this v příkazu "$this->fun1();" použít něco jiného nebo funkce fun1 musí být public? :o


class A {
   public function __construct ()
   {
      $this->fun1();
   }
}

class B extends A {
   private function fun1 ()
   {
      echo "I need to do this operation :/...";
   }   
}

$a = new B();


Mockát děkuji za odpovědi  :) :D ;)
Jan Oktábec
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Jan Oktábec 10. 05. 2015, 15:23:14
Doplnění: Z důvodu bezpečnosti bych byl radši, aby zůstala private :/ Jinak když ji změním na public, tak to funguje...
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: v 10. 05. 2015, 15:32:17
co zkusit protected  function fun1 () místo    private function fun1 () ?
jenom tip, php nepoužívám
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Hmmm 10. 05. 2015, 15:38:47
Ano, protected by to malo vyriesit. Protected znamena, ze bude private v materskej triede a aj v tej, ktora ju rozsiruje.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Kit 10. 05. 2015, 15:45:29
Vzhledem k tomu, že B není A, není v daném případě možné použít dědičnost.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: kozzi11 10. 05. 2015, 16:57:54
Mám problém s následujícím kódem. Místo provedení příkazu:

   echo "I need to do this operation :/...";

se zobrazí tato hláška:

   Fatal error: Call to private method B::fun1() from context 'A' in C:\Server\www\classproblem.php on line 6

Ačkoli kód vypadá nesmyslně (volání funkce fun1 v constructu objektu A, ačkoli funkce fun1 je v objektu B, který je potomkem objektu A), je v případě mého projektu nutností. Proč to nejde? Mám místo $this v příkazu "$this->fun1();" použít něco jiného nebo funkce fun1 musí být public? :o


class A {
   public function __construct ()
   {
      $this->fun1();
   }
}

class B extends A {
   private function fun1 ()
   {
      echo "I need to do this operation :/...";
   }   
}

$a = new B();


Mockát děkuji za odpovědi  :) :D ;)
Jan Oktábec


abstract class A {
        public function __construct ()
        {
                $this->fun1();
        }

        abstract protected function fun1();
}

class B extends A {
        protected function fun1 ()
        {
                echo "I need to do this operation :/...";
        }   
}

$a = new B();

Název: Re:Prosím o radu s PHP OOP
Přispěvatel: karel 10. 05. 2015, 18:09:25
Prasím, prasíš, prasíme
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: tdvorak 11. 05. 2015, 06:14:52
Vzhledem k tomu, že B není A, není v daném případě možné použít dědičnost.
To je zas rada, jak noha. Člověk by čekal, že když se pořád odvoláváš na OOP, dědičnosti a návrhové vzory, tak to teď využiješ a dobře poradíš. A místo toho čteme zas jen fragment jak z automatického generátoru textů.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: perceptron 11. 05. 2015, 08:53:55
pan Oktabec,
vas kod *je* nezmyselny a popiera OOP. to ze je nutnostou vo vasom projekte a chcete prelomit oop, znamena len to, ze vas objektovy dizajn je zly.

ked mate triedu Netvor (vase A) a Trolla ktora dedi od Netvora (vase B), vy chcete
aby po vytvoreni vseobecneho Netvora sa zavolala metoda troll->sedPodMostom().

Netvor (vase A) je vseobecna trieda ktora nevidi a nepotrebuje a nechce vidiet do metod podtried pretoze by nebola znovupouzitelna

vy si myslite ze ked vyrobite Trolla a priradite ho do Netvora, zrazu trieda Netvor bude magicky vidiet do PRIVATNYCH metod Trolla (troll->dajSmrad()) ale takto to nefunguje

jedno z rieseni: vyrobit v Netvorovi protected metodu 'fun1', v Trollovi (a Drakovi a Hydre) ju prekryt.

alebo dajte konkretnejsi priklad namiesto A a B a fun1

Citace
To je zas rada, jak noha.
esteze tam nie su gettery a settery, to by sme si pochrochtali blahem
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: to_je_jedno 11. 05. 2015, 09:18:44
nez se clovek do cehokoliv pusti mel by mit aspon nezbytne teoreticke zaklady. je jedno jestli se jedna o kachlickovani koupelny, mdrání nebo OOP.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: hawran diskuse 11. 05. 2015, 09:57:05
pan Oktabec,
vas kod *je* nezmyselny a popiera OOP. to ze je nutnostou vo vasom projekte a chcete prelomit oop, znamena len to, ze vas objektovy dizajn je zly.

ked mate triedu Netvor (vase A) a Trolla ktora dedi od Netvora (vase B), vy chcete
aby po vytvoreni vseobecneho Netvora sa zavolala metoda troll->sedPodMostom().

Netvor (vase A) je vseobecna trieda ktora nevidi a nepotrebuje a nechce vidiet do metod podtried pretoze by nebola znovupouzitelna

vy si myslite ze ked vyrobite Trolla a priradite ho do Netvora, zrazu trieda Netvor bude magicky vidiet do PRIVATNYCH metod Trolla (troll->dajSmrad()) ale takto to nefunguje
...
+1
Pěkně.

Citace
To je zas rada, jak noha.
esteze tam nie su g*y a s*y, to by sme si pochrochtali blahem
???
Ani naznačovat, ani naznačovat!!!
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: hawran diskuse 11. 05. 2015, 09:57:30
nez se clovek do cehokoliv pusti mel by mit aspon nezbytne teoreticke zaklady. je jedno jestli se jedna o kachlickovani koupelny, mdrání nebo OOP.
Modrání?
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: j 11. 05. 2015, 10:30:31
esteze tam nie su gettery a settery, to by sme si pochrochtali blahem
Jeste ze phpko neumi inline asm ... to bych videl na nejakej ten long jump, sak jit to prece musi.

----
A to si predstav, ze ti takovouhle prasecinu pak klidne prodaj.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Hmmm 11. 05. 2015, 10:37:24
Gettery a settery nie su problem. Problem je programator, ktory ich nevie spravne pouzivat alebo ich uz len z principu zavrhuje.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Logik 11. 05. 2015, 11:47:39
Nevím, co tu blbnete s trolama a netvorama. Uvedenej pattern je úplně normální, akorát by pro účely dokumentace a syntax checking mělo
bejt, že třída A je označena abstract a je v ní abstraktní metoda func1. To je celé na rovině "myšlenkové".

Na rovině faktické pak má PHP zmršenej koncept dědičnosti, takže tam nejde udělat abstraktní virtuální metoda private, takže to takto udělat nejde a musí holt ta metoda bejt protected. Pokud to chceš fakt mít private, tak není jiná cesta, než tu funkcionalitu vydělit do speciální třídy a dát ji jako private membera té třídy - ale já bych se s tím neštval :-)
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: karol 11. 05. 2015, 12:30:33
Nevím, co tu blbnete s trolama a netvorama. Uvedenej pattern je úplně normální, akorát by pro účely dokumentace a syntax checking mělo
bejt, že třída A je označena abstract a je v ní abstraktní metoda func1. To je celé na rovině "myšlenkové".

Na rovině faktické pak má PHP zmršenej koncept dědičnosti, takže tam nejde udělat abstraktní virtuální metoda private, takže to takto udělat nejde a musí holt ta metoda bejt protected. Pokud to chceš fakt mít private, tak není jiná cesta, než tu funkcionalitu vydělit do speciální třídy a dát ji jako private membera té třídy - ale já bych se s tím neštval :-)

nielen v PHP sa neda vytovrit private abstact metoda. nejde to ani v jave a je to celkom logicke, private metoda sa ma pouzivat iba v triede kde je deklarovana. ostatne triedu ju nevidia, cize ju ani nemozu prepisat, aj ked je abstraktna.

Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Logik 11. 05. 2015, 12:52:29
Např. v C++ to jde a není na tom nic divného.

Říkáš tím: tady mám metodu, kterou zděděné třídy mají implementovat, ale nemají ji volat.

(PS: ponechávám vedle to, že princip privátních metod je kvůli testování poněkud problematický koncept jako takový).
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: perceptron 11. 05. 2015, 14:49:33
samozrejme ale doraz je na tom 'abstract' ktory sa v zadani nenachadzal

s tym private abstract: nema ju ani c# ani java a predpokladam ze php kradlo oo dizajn z tohto sveta
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Logik 11. 05. 2015, 21:29:00
Jo, php v poslední době dost Javovatí. A bohužel pravidla dědičnosti si taky bere od ní....
To ještě neznamená, že to jsou pravidla logická :-).
Zkuste si schválně níže tipnout, co bude výstupem tohodle programu (bez spouštění :-)).

Kód: [Vybrat]
public class Test {
    public static void main(String[] args) {
        Nested n = new Nested();
        n.test();
        n.print();
    }

    private void print() {
        System.out.println("PRIVATE");
    }

    public static class Nested extends Test {
        public void test() {
            this.print();
            super.print();
        }
       
        public void print() {
            System.out.println("PUBLIC");
        }
    }
}


Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Jakub Galgonek 11. 05. 2015, 22:12:52
Jo, php v poslední době dost Javovatí. A bohužel pravidla dědičnosti si taky bere od ní....
To ještě neznamená, že to jsou pravidla logická :-).
Zkuste si schválně níže tipnout, co bude výstupem tohodle programu (bez spouštění :-)).

Privátní metody v Javě nejsou virtuální, když si to člověk uvědomí, tak pak to chování, na které poukazuje ten příklad, dává docela dobrý smysl.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: perceptron 11. 05. 2015, 22:22:57
tak pravidla javy su v mnohych pripadoch jednoduchsie ako c++: tie ohlasovane benefity v cpp ako vas private abstract su vyhodou len za komplexnejsie chapanie a viacero okrajovych a pripadov (a c++ teda nie je demonstracia jednoduchej syntaxe a semantiky jazyka potazmo v oop)

napr pravidlo v jave pre resolving metody je vdaka "vsetky metody su virtualne" velmi jednoduche: pozri na skutocny typ objektu a volaj nanom metodu. ak nenajdes pozri do rodica

btw odpoved je public private public

n ma typ Nested a
1) test() sa zavola na Nested
1a) this ktorym je objekt Nested teda print vracia PUBLIC (iny pripad nie je mozny, Nested je staticka trieda, cize this nemoze referovat na Test, aj keby chcela a toto nie je javascript)
1b) dalej sa zavola rodicovsky print, co je PRIVATE
2) n.print() zavola PUBLIC opat na Nested, preto PUBLIC

ten priklad je zial masturbacia nad moznostami syntaxe mimo realneho kodu hodna mozno tak java certifikatu... kde nechate kandidata na interview pat minut v hlave kompilovat kod a potom sa hrdit na fore tym ze vy ste to dali a on nie.



Název: Re:Prosím o radu s PHP OOP
Přispěvatel: perceptron 11. 05. 2015, 22:25:30
ok tak selfpwn nedal som to :D

super.print() je privatny to som si nevsimol, funguje to len vdaka tomu ze Nested.print vidi Test.print cez synteticky pristup ale to mi musel vysvetlit eclipse
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: kozzi11 11. 05. 2015, 22:59:30
Jo, php v poslední době dost Javovatí. A bohužel pravidla dědičnosti si taky bere od ní....
To ještě neznamená, že to jsou pravidla logická :-).
Zkuste si schválně níže tipnout, co bude výstupem tohodle programu (bez spouštění :-)).

Kód: [Vybrat]
public class Test {
    public static void main(String[] args) {
        Nested n = new Nested();
        n.test();
        n.print();
    }

    private void print() {
        System.out.println("PRIVATE");
    }

    public static class Nested extends Test {
        public void test() {
            this.print();
            super.print();
        }
       
        public void print() {
            System.out.println("PUBLIC");
        }
    }
}

Nejak nechapu co by tady nemel clovek vedet. Mi na tom neprijde nic zvlastniho. Ale mozna jsem neco prehledl
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Jakub Galgonek 11. 05. 2015, 23:11:40
napr pravidlo v jave pre resolving metody je vdaka "vsetky metody su virtualne" velmi jednoduche: pozri na skutocny typ objektu a volaj nanom metodu. ak nenajdes pozri do rodica

Pravidla v Javě jsou opravdu mnohem jednodušší než v C++, ale zase nejsou až tak jednoduchá, jak píšeš. Stručně: Napřed se prohledá třída i všichni její předci a vyberou se všechny metody, které jsou pro dané parametry aplikovatelné. Z nich se pak vybere ta, které je nejvíce specifická pro dané parametry.

Schválně si zkus něco takového:

Kód: [Vybrat]
class Param1 {}

class Param2 extends Param1 {}

class Class1 {
   public void print(Param2 x) {
        System.out.println("Class1.print(Param2 x)");
   }
}


class Class2 extends Class1 {
   public void print(Param1 x) {
        System.out.println("Class2.print(Param1 x)");
   }
}

public class Main {
    public static void main(String[] args) {
        (new Class2()).print(new Param2());
    }
}
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: perceptron 12. 05. 2015, 08:51:58
@Jakub Galgonek
jo, toto je dobra poznamka, dik
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Sten 12. 05. 2015, 12:27:55
Jo, php v poslední době dost Javovatí. A bohužel pravidla dědičnosti si taky bere od ní....
To ještě neznamená, že to jsou pravidla logická :-).
Zkuste si schválně níže tipnout, co bude výstupem tohodle programu (bez spouštění :-)).

Co je na tom nelogického? Privátní metody jsou přístupné metodám a vnořeným třídám. Je to jinak než v C++, ale je to jen jiné řešení toho, co private vlastně znamená. Můžete si to přeložit tak, že vnořené třídy jsou automaticky friend.

Privátní metody v Javě nejsou virtuální, když si to člověk uvědomí, tak pak to chování, na které poukazuje ten příklad, dává docela dobrý smysl.

Privátní metody sice nejsou virtuální, ale volání super také není virtuální. Ostatní volání (přes this a n) by dala stejný výsledek, i kdyby ta metoda virtuální byla.

Pokud ten příklad chcete zajímavější, zkuste tohle:

Kód: [Vybrat]
class Test {
    public static void main(String[] args) {
        Nested n = new Nested();
        n.test();
        n.print();
        Test t = n;
        t.print();
    }

    private void print() {
        System.out.println("PRIVATE");
    }

    public static class Nested extends Test {
        public void test() {
            this.print();
            super.print();
        }
       
        public void print() {
            System.out.println("PUBLIC");
        }
    }
}
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Logik 12. 05. 2015, 22:19:09
Galonek:
Jasně, že když znáš pravidla, tak to víš. Jde o to, že logickej jazyk by měl mít pravidla "intuitivní".
A jak je vidět z reakce většiny diskutujících - evidentně intuitivní nejsou....
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: m 12. 05. 2015, 23:00:24
Jde o to, že logickej jazyk by měl mít pravidla "intuitivní".

Proto to by to logický jazyk měl dělat neintuitivně, tedy že programátor musí sdělit jak si to představuje. Třeba přepsání metody v potomku by nemělo jít přeložit bez toho, aby programátor nespecifikoval zda chce override nebo hide nebo overload. Bylo by to více psaní, ale odpadly by zbytečné nejasnosti.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: perceptron 13. 05. 2015, 10:17:29
ide tu o standardny rezim fungovania alebo ide o okrajovy pripad? v syntaxe tych mainstream jazykov je kopa pitfallov... otazka je ci je to naozaj pitfall alebo hra o ich hladani

(combo nested class dediaci od wrappujuceho classu je v jave code smell)
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Logik 13. 05. 2015, 13:51:58
Je to případ dovedení ad absurdum, na kterém je vidět, že rozhodnutí, že to, že private metody budou nevirtuální je "zjednodušení pro kompilátor", které není intuitivní.

A které mj. vede k nemožnosti vyjádřit IMHO rozumnou myšlenku, abych zakázal volání funkce kterou musí definovat potomci, protože se vztahuje k nějaké specifické implementaci něčeho, ovšem jelikož ta funkce neudržuje objekt ve "well defined" stavu, tak by tu funkci potomci neměli mít možnost volat.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Daniel Kozak 15. 05. 2015, 08:14:31
Je to případ dovedení ad absurdum, na kterém je vidět, že rozhodnutí, že to, že private metody budou nevirtuální je "zjednodušení pro kompilátor", které není intuitivní.

Tak ono tady nejde podle me tak o zjednoduseni pro kompilator, ale spise o vykon a moznou optimalizaci. Stejnej problem ma i napriklad jazyk D, ktery sice hodne vychazi z C++, ale zrovna OOP ma vice po vzoru javy.

Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Jakub Galgonek 15. 05. 2015, 09:27:30
Je to případ dovedení ad absurdum, na kterém je vidět, že rozhodnutí, že to, že private metody budou nevirtuální je "zjednodušení pro kompilátor", které není intuitivní.

Tak ono tady nejde podle me tak o zjednoduseni pro kompilator, ale spise o vykon a moznou optimalizaci. Stejnej problem ma i napriklad jazyk D, ktery sice hodne vychazi z C++, ale zrovna OOP ma vice po vzoru javy.

Výkonnostní optimalizace to asi nebude. Třeba takové final metody se volají pomocí invokevirtual, i když by je šlo přímo devirtualizovat. (Ony se tedy nakonec asi devirtualizují, ale jinde a bez ohledu na klíčové slovo final).

Podle mne jde spíše o zjednodušení pro člověka. On stav, kdy můžete překrýt (override) metodu, které je private v jiné třídě, ale nemůžete ji zavolat, přecejen trochu neintuitivní.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Logik 15. 05. 2015, 09:54:32
Co je neintuitivní se možná neshodem v globálu, ale pokud by možnost předefinování privátních metod byla např. omezená na metody označené jako abstract, tak co by bylo na tom neintuitivní?

Co je neintuitivního na tom, že je možné předefinovat metodu, která je přímo označená jako "todle musíš předefinovat"?
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Jakub Galgonek 15. 05. 2015, 10:09:45
Co je neintuitivního na tom, že je možné předefinovat metodu, která je přímo označená jako "todle musíš předefinovat"?

Pokud je metoda označena "nesmíš o ní vědět" a "musíš ji předefinovat", tak je to prostě neintuitivní kombinace, a proto ji Java zakazuje.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Ondra Satai Nekola 15. 05. 2015, 10:23:49
Co je neintuitivní se možná neshodem v globálu, ale pokud by možnost předefinování privátních metod byla např. omezená na metody označené jako abstract, tak co by bylo na tom neintuitivní?

Co je neintuitivního na tom, že je možné předefinovat metodu, která je přímo označená jako "todle musíš předefinovat"?

Nemichas private s protected?
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: DW 15. 05. 2015, 11:05:30
nez se clovek do cehokoliv pusti mel by mit aspon nezbytne teoreticke zaklady. je jedno jestli se jedna o kachlickovani koupelny, mdrání nebo OOP.

Škoda že nejde dať like :D
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: DW 15. 05. 2015, 11:09:43
Na rovině faktické pak má PHP zmršenej koncept dědičnosti, takže tam nejde udělat abstraktní virtuální metoda private, takže to takto udělat nejde a musí holt ta metoda bejt protected.

On nejaký OOP jazyk umožnuje abstraktné súkromné metódy?
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Jakub Galgonek 15. 05. 2015, 11:13:16
On nejaký OOP jazyk umožnuje abstraktné súkromné metódy?

Už to tu myslím padlo, v C++ to jde.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Jakub Galgonek 15. 05. 2015, 11:25:35
Jinak v Javě by se dal přístup k accessibility shrnout jako "co nemohu vidět, to pro mne neexistuje", což je trochu rozdíl oproti C++. Například následující příklad v C++ neprojde:

Kód: [Vybrat]
class A {};
class B : public A {};

class X {
    public:    void foo(A a){}
    protected: void foo(B b){}
};

class Bar {
    void bar(X x, B b) {
        x.foo(b);
    }
};

C++ zahlásí chybu, protože třída Bar nemá přístup k protected metodě X.foo(B). Javě to nevadí, ta prostě zavolá X.foo(A), kterou vidí a je na ten parametr aplikovatelná. Pozor jen, že pokud to budete v Javě zkoušet, tak je dobré mít X a Bar v jiných balíčcích, protože třídy z jednoho balíčku si navzájem vidí (a mohou tedy i volat) své protected metody.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: perceptron 15. 05. 2015, 11:29:18
Citace
A které mj. vede k nemožnosti vyjádřit IMHO rozumnou myšlenku, abych zakázal volání funkce kterou musí definovat potomci, protože se vztahuje k nějaké specifické implementaci něčeho, ovšem jelikož ta funkce neudržuje objekt ve "well defined" stavu, tak by tu funkci potomci neměli mít možnost volat.
occamova britva

rozumnych myslienok ktore nemaju podporu v jazyku je viac... napriklad plky voci chybajucej viacnasobnej dedicnosti v jave

zase vsak cim viac konstruktov tym je to vacsie psycho na ucenie sa a vysvetlovanie a chapanie... hec ved c++ vs java je otvoreny priklad (a v inej planete java vs scala)

Název: Re:Prosím o radu s PHP OOP
Přispěvatel: m 15. 05. 2015, 11:49:24
napriklad plky voci chybajucej viacnasobnej dedicnosti v jave

Vícenásobná dědičnost chybí v mnoha jazycích a nikde k tomu nemají plnohodnotné uspokojivé řešení.
Konstrukty kterým programátor nerozumí, tak je nemusí používat.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: perceptron 15. 05. 2015, 12:00:51
aktivne nie ale stane sa ze ich bude citat a maintainovat po ostatnych :-))
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Sten 15. 05. 2015, 12:06:31
rozumnych myslienok ktore nemaju podporu v jazyku je viac... napriklad plky voci chybajucej viacnasobnej dedicnosti v jave

Mě daleko víc vadí type erasure v generikách, takže třeba nelze udělat obecný wrapper přes dědičnost. Tohle u Javy trochu nedomysleli, generika jsou spíš pro dynamické jazyky.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Logik 15. 05. 2015, 15:08:17
Citace
....
aktivne nie ale stane sa ze ich bude citat a maintainovat po ostatnych :-))
Jo, to je přesně Javovskej protektivní přístup: někdo by to mohl používat blbě, tak to radši zakážeme.
Pokud je někdo čuník, tak je čuník, a seberestriktivnější jazyk mu nepomůže. A pokud někdo není čuník,
tak proč mu zakazovat užitečné obraty jen proto, že se s nimi dá prasit?

Jinak zakázání abstract private není konstrukce navíc, ale naopak restrikce navíc, stejně jako "devirtualizace"
private metod, z který to vychází, je opět pravidlo navíc a nikoli pravidlo namíň, takže ani ta argumentace
až tak nesedí....

Název: Re:Prosím o radu s PHP OOP
Přispěvatel: m 15. 05. 2015, 15:24:37
aktivne nie ale stane sa ze ich bude citat a maintainovat po ostatnych :-))

Na údržbu starého kódu obvykle stačí pasivní znalosti. Když se nová featura ukáže jako přínosná, třeba lambda funkce, stejně se to bude muset naučit tak jako tak.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Jakub Galgonek 15. 05. 2015, 16:29:55
Jinak zakázání abstract private není konstrukce navíc, ale naopak restrikce navíc, stejně jako "devirtualizace"
private metod, z který to vychází, je opět pravidlo navíc a nikoli pravidlo namíň, takže ani ta argumentace
až tak nesedí....

Ono na to jde koukat také jinak: To, že jsou privátní metody nevirtuální, je spíše jen pouhý důsledek Java pravidel. Java rozdělení metod na virtuální a nevirtuální v podstatě nezná, takže klidně se na to můžeme koukat tak, že všechny metody jsou virtuální. Když se volá metoda, tak se najdou metody, které jsou accessibile, a z nich se nějaká vybere. Podobně při deklaraci metody - projdou se accessibile metody v předcích a pokud je tam nějaká se stejnou signaturou, provede se její overriding. Pokud se například v abstraktní třídě deklaruje metoda abstract void foo(), tak jediný, kdo ji bude moci implementovat, budou třídy ze stejného balíčku, protože jiné třídy prostě tuto metodu neuvidí. A přitom foo() virtuální jistě je.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Kit 16. 05. 2015, 07:22:52
napriklad plky voci chybajucej viacnasobnej dedicnosti v jave

Vícenásobná dědičnost chybí v mnoha jazycích a nikde k tomu nemají plnohodnotné uspokojivé řešení.
Konstrukty kterým programátor nerozumí, tak je nemusí používat.

Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: m 16. 05. 2015, 09:34:38
Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

Vyhne se jí jenom proto že musí, neboť autoři mnoha jazyků se ji neobtěžovali implementovat. Přirozená dědičnost je včetně vícenásobné.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Kit 16. 05. 2015, 10:03:38
Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

Vyhne se jí jenom proto že musí, neboť autoři mnoha jazyků se ji neobtěžovali implementovat. Přirozená dědičnost je včetně vícenásobné.

Vícenásobná dědičnost je zbytečná, protože není přirozená. Dali ji jen do C++, ale evidentně to byla zásadní chyba.

Zkus uvést příklad použitelné násobné dědičnosti. Všechny případy, které jsem dosud viděl, byly jen uměle vykonstruované a neměly odraz v realitě.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: kozzi11 16. 05. 2015, 12:20:59
Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

Vyhne se jí jenom proto že musí, neboť autoři mnoha jazyků se ji neobtěžovali implementovat. Přirozená dědičnost je včetně vícenásobné.

Tak to neni zcela pravda, ja se ji vyhybam i v jazycich ktere ji podporuji, protoze pro me jeji vyuziti toho zas tolik neprinasi.
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: kozzi11 16. 05. 2015, 12:39:38
napriklad plky voci chybajucej viacnasobnej dedicnosti v jave

Vícenásobná dědičnost chybí v mnoha jazycích a nikde k tomu nemají plnohodnotné uspokojivé řešení.
Konstrukty kterým programátor nerozumí, tak je nemusí používat.

Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

JJ jeji potreba je dosti sporna a pokud nekdy neco takoveho potrebujeme tak si ve vetsine pripadech clovek vystaci s kompozici. Napriklad jazyk D to resi elegantne:
Kód: [Vybrat]
module main;
import std.stdio;

struct Camera
{
void takePicture()
{
writeln("click");
}
}

class Phone
{
void call()
{
writeln("ring ring");
}
}

class CameraPhone : Phone
{
Camera camera;
alias camera this;
}

void main(string[] args)
{
auto phone = new CameraPhone();
phone.call();
phone.takePicture();
}

neceho podobneho jde v php taky dosahnout a to bud traitama:

Kód: [Vybrat]
<?php
trait TCamera
{
    public function 
takePicture() 
    {
        echo 
"click" PHP_EOL;
    }
}

trait 
TPhone
{
    public function 
call()
    {
        echo 
"ring ring" PHP_EOL;
    }
}

class 
Camera
{
    use 
TCamera;
}

class 
Phone
{
    use 
TPhone;
}

class 
CameraPhone
{
    use 
TCamera,TPhone;
}

$phone = new CameraPhone();
$phone->takePicture();
$phone->call();

nebo pres magicke metody __call, __callStatic,...
Název: Re:Prosím o radu s PHP OOP
Přispěvatel: Kit 16. 05. 2015, 12:59:43
Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

JJ jeji potreba je dosti sporna a pokud nekdy neco takoveho potrebujeme tak si ve vetsine pripadech clovek vystaci s kompozici. Napriklad jazyk D to resi elegantne:
Kód: [Vybrat]
... class CameraPhone : Phone ...
neceho podobneho jde v php taky dosahnout a to bud traitama...
nebo pres magicke metody __call, __callStatic,...

Tedy definovat CameraPhone jako telefon, který umí fotit. Šel by i fotoaparát, se kterým se dá telefonovat (také existují). Prostě nedefinovat Pegase jako křížence ptáka a koně, ale jako koně, který umí létat.

Traitům se vyhýbám kvůli snížení počtu WTF v kódu. Z podobných důvodů šetřím s metodami __call() a __callStatic(). Své použití však určitě mají - např. v adaptérech.