Diskuze: Nové instance ze stringu

C# .NET .NET (C# a Visual Basic) Nové instance ze stringu American English version English version

Avatar
thirdknown
Člen
Avatar
thirdknown:

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:

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:

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:

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
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:

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:

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:

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:

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:

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:

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:

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.