Diskuze: OOP - Rozdělení proměnných třídy do "bloků" a zapouzdření
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Normálně se tohle nepoužívá. Třeba takové kontrolky v WPF nebo
WinForms mají také minimálně desítky vlastností a vše je prostě na 1
úrovni. Máš nějaký specifický důvod pro rozdělení vlastností do
tříd?
Pokud bys to chtěl třeba z důvodu enumerace vlastností v jednotlivých
"bloků" třeba jen zbraní, nejčistší by bylo udělat si vlastní atribut,
který by tu skupinu specifikoval pomocí enum. Potom by sis udělal metodu nebo
get-only property, která by pomocí reflexe mohla vrátit vlastnosti jen z
dané skupiny. Jenže to bys asi musel udělat třídu navíc, která by
reprezentovala jednotlivé vlastnosti, nejspíš generickou.
Pokud chceš kód, napiš mi. A použij prosím tlačítko odpovědět
OOP je o způsobu návrhu aplikace, ne o bezpečnosti.
To znamená, že pokud máš instanci s rozhraním IDovednosti, tak to
explicitně vyjadřuje, jak s danou instancí zacházet.
Dokonce i pokud bys nevěděl, jaká třída je ve skutečnosti instanciovaná,
jsou v C# způsoby, jak změnit její interní stav.
Tím pádem si s tímhle nedělej hlavu a používej typy jako vyjádření
způsobu komunikace s objektem.
A ohledně logiky OOP si nedělej hlavu, tvůj návrh na 100% neviděl OOP
ani z dálky
Návrh objektových aplikací musí začínat úplně jinak a vzniká na
základě komunikace mezi objekty, ne na základě jejich vlastností.
v ramci C# stejne muzes pouzit reflexi a zmenit libovolny private field na jakekoli tride.
co se tyka prikladu tak staci abys tu tridu Dovednosti nastavil na private a vnoril do tridy Postava a mas to vyresene.
Tady je to jedno, protože ten návrh je z hlediska návrhu špatně. Proto neexistují žádné fancy mechanismy, jak to udělat. Reflexe je sice zajímavá, ale nastavování privátních proměnných nepaří mezi best practices.
Děkuji všem za odpovědi.
Vlastnosti, Dovednosti a Schopnosti (V, D, S) jsem chtěl rozdělit do tříd především z toho důvodu, aby se k nim pohodlně přistupovalo. Po napsání slova postava. intellisense nenabízí milion proměnných ale pouze 3 (V, D, S) a po vybrání Dovedností zobrazí další např. JednorucniZbrane).
Petr Čech Něco o reflexích jsem našel až v pokročilém programování, já se zatím potloukám na nízké úrovni. Kdybys mi napsal nějaký příklad jak to zde využít, byl bych rád.
Enum se mi zdá pro tento příklad celkem vhodný. Napadlo mě to skladovat v privátní array kolekci a ven to pouštět přes metodu. Vypadá to celkem jednoduše a přistupuje se k tomu vcelku pohodlně.
enum Dovednosti { JednorucniZbrane, ObourucniZbrane, DrevcoveZbrane }; // atd
// Část že třídy Postava
private int[] dovednosti = new int[Enum.GetNames(typeof(Dovednosti)).Length];
public int VratDovednost(Dovednosti dovednost)
{
return dovednosti[(int)dovednost];
}
// Mimo třídu
postava.VratDovednost(Dovednosti.DrevcoveZbrane);
coells To, že se dá nějak změnit private field na jákekoliv třídě jsem nevěděl. Děkuji za informaci.
Asi to nebudu řešit. Nejjednodušší bude, když prostě ve třídě Postava inicializuju všechny proměnné jako property {get; private set} s předponou např. DovednostDrevcoveZbrane nebo SchopnostAtletika
Zobrazeno 7 zpráv z 7.