Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)
Avatar
thirdknown
Člen
Avatar
thirdknown:8.4.2013 15:59

Ahoj,

v PHP jsem zběhlý, ale v C# zatím moc ne.

Mám rád programy, které si "samy poradí". Pomáhá to k větší jednoduchosti při rozšiřování programu. Holt nechci všude psát

if ($blabla == "trida") {return new trida();}
if ($blabla == "tridicka") {return new tridicka();}

Chtěl jsem se vás zeptat, jak napsat tohle v C#:

*<?php

class trida {
public function __construct () {
echo "Ahoj, já jsem třída";
}
}

class tridicka {
public function __construct () {
echo "Ahoj, já jsem třídička";
}
}

$nazev = "tridicka";
new $nazev;

?>*

Program vypíše Ahoj, já jsem třídička.
Díky

 
Odpovědět 8.4.2013 15:59
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na thirdknown
David Čápka:8.4.2013 16:17

PHP to dělá přes tzv. reflexi, tu má C# také. Nedávno jsem tu zrovna tohle řešil, bohužel si už nevzpomínám na vlákno. Můžeš si dát před své třídy tzv. atribut a pomocí reflexe tu třídu pak najít.

Nahoru Odpovědět 8.4.2013 16:17
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:8.4.2013 16:23

Obávám se, že thirdknown chce udělat Simple Factory v C# stejně špatným způsobem, jako to dělal v PHP.

Nahoru Odpovědět 8.4.2013 16:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:8.4.2013 16:24

Samozřejmě to jde dělat jinak, někde jsem to rozváděl dost detailně, zkusím to najít.

Nahoru Odpovědět 8.4.2013 16:24
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na thirdknown
David Čápka:8.4.2013 16:26

Pročti si vlákno pod tímhle článkem: http://www.itnetwork.cz/…f-switch/all#…

Nahoru Odpovědět 8.4.2013 16:26
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:8.4.2013 16:32

V Javě se to dá elegantně udělat přes enum.

Nahoru Odpovědět 8.4.2013 16:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
thirdknown
Člen
Avatar
Odpovídá na Kit
thirdknown:8.4.2013 17:12

Kit: Můžu se zeptat, co je na té továrničce špatně? (kritiku přijímám)

 
Nahoru Odpovědět 8.4.2013 17:12
Avatar
Kit
Redaktor
Avatar
Odpovídá na thirdknown
Kit:8.4.2013 17:32

Obvykle se totiž do $nazev dává hodnota získaná z $_GET nebo $_POST. Ošetřit tyto hodnoty proti nepravostem nemusí být triviální. Problémem tedy může být potenciální zranitelnost.

Většinou se v té továrně nevyrábí takový sortiment, aby se to nedalo vyjmenovat.

Nahoru Odpovědět 8.4.2013 17:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
thirdknown
Člen
Avatar
Odpovídá na Kit
thirdknown:8.4.2013 17:42

Ne vše se musí získávat přímo či nepřímo ze superglobálů.

Dobře, takže i normální factory je zranitelná stejně, jako tahle jednoduchá, ne?

 
Nahoru Odpovědět 8.4.2013 17:42
Avatar
Kit
Redaktor
Avatar
Odpovídá na thirdknown
Kit:8.4.2013 17:57

Nevím, jak jsi zdatný. Zkus si představit, co by se asi s aplikací stalo, kdyby se do toho řetězce dostal název nějaké jiné (třeba systémové) třídy nebo třídy z jiného adresáře. Pokud se to stát nemůže, tak to asi budeš mít v pořádku a můžeš použít reflexi viz sdraco.

BTW: místo armády ifů se v PHP dá použít jeden switch.

Nahoru Odpovědět  +1 8.4.2013 17:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
thirdknown
Člen
Avatar
Odpovídá na Kit
thirdknown:8.4.2013 18:52

Však to je mi jasné.
Větu Ne vše se musí získávat přímo či nepřímo ze superglobálů. jsem myslel vážně. Třeba v případě, že moje aplikace se připojuje na mikrotik a něco z něj získává. Tady fakt není $_GET nebo $_POST. Nejsem nezdatný.
Switch místo if mám již za sebou.

 
Nahoru Odpovědět 8.4.2013 18:52
Avatar
Jakub Šárník:11.4.2013 20:32

V tom c# je to metoda CreateInstance objektu Activator. Podívej se sem http://msdn.microsoft.com/…nstance.aspx

 
Nahoru Odpovědět 11.4.2013 20:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.