Prosím o radu s PHP OOP

karol

Re:Prosím o radu s PHP OOP
« Odpověď #15 kdy: 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.



Logik

  • *****
  • 1 050
    • Zobrazit profil
    • E-mail
Re:Prosím o radu s PHP OOP
« Odpověď #16 kdy: 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ý).

perceptron

Re:Prosím o radu s PHP OOP
« Odpověď #17 kdy: 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

Logik

  • *****
  • 1 050
    • Zobrazit profil
    • E-mail
Re:Prosím o radu s PHP OOP
« Odpověď #18 kdy: 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");
        }
    }
}



Re:Prosím o radu s PHP OOP
« Odpověď #19 kdy: 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.


perceptron

Re:Prosím o radu s PHP OOP
« Odpověď #20 kdy: 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.




perceptron

Re:Prosím o radu s PHP OOP
« Odpověď #21 kdy: 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

kozzi11

Re:Prosím o radu s PHP OOP
« Odpověď #22 kdy: 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

Re:Prosím o radu s PHP OOP
« Odpověď #23 kdy: 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());
    }
}

perceptron

Re:Prosím o radu s PHP OOP
« Odpověď #24 kdy: 12. 05. 2015, 08:51:58 »
@Jakub Galgonek
jo, toto je dobra poznamka, dik

Sten

Re:Prosím o radu s PHP OOP
« Odpověď #25 kdy: 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");
        }
    }
}

Logik

  • *****
  • 1 050
    • Zobrazit profil
    • E-mail
Re:Prosím o radu s PHP OOP
« Odpověď #26 kdy: 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....

m

Re:Prosím o radu s PHP OOP
« Odpověď #27 kdy: 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.

perceptron

Re:Prosím o radu s PHP OOP
« Odpověď #28 kdy: 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)

Logik

  • *****
  • 1 050
    • Zobrazit profil
    • E-mail
Re:Prosím o radu s PHP OOP
« Odpověď #29 kdy: 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.