A felsorolás típus (enum) értékeihez tudunk a nevükön kívül is információkat csatolni? (C#)
"vagy az osztályban külön-külön kell definiálni a teendőket a kisállat összes lehetséges értéke esetén"
Ennek leginkább a kisállat osztályban lenne a helye, az elég rossz megoldás, hogy:
switch (allat) case emez case amaz stb.
Szóval nem enumra van szökséged, hanem egy abstract base classra, vagy valami hasonló.
Esetleg attribútumba még tehetsz dologkat, pl
enum MyEnum
{
[MyAttr("ez az elso")]
EnumVal1,
[MyAttr("ez a masodik")]
Enumval2,
}
Ez pl. hasznos lehet, ah UI-on akarod megjeleniteni pl egy comboboxban az értékeket és lokalizálni kell a megjelenitett értékeket, nem csak simán az Enum.ToString-et akarod látni.
Nyilván elméletben bármire használhatod ezt, akár kódot is irhatsz az attributum értékébe, csak hülyeség lenne, pláne a kérdés leirásban szereplő célra. Neked az kell amit #1 és #2 irt.
A Te use case-d egy tipikus példa az enum használatára. Annak, ahol használni akarod, megadsz egy Kisállat típusú változót, és switch-case-el befolyásolod a program futását:
switch(pet)
{
case CAT:
cw tabtab "Macska";
break;
case DOG:
cw tabtab "Kutya";
break;
default:
throw new NotImplemented
}
Sima enumba nem tudod, csak a nevet felvenni, de erre van az ún. Smart Enum Pattern:
public sealed class SmartEnum // public sealed, mert kell, h. mindenki lássa, és sealed, mert nem akarsz belőle örökölni.
{
#region Property-k
private ctor{ ... } // Fontos! Ne lehessen példányosítani, csak saját magát, attól enum!
// Enum értékek
public static readonly SmartEnum CAT = new SmartEnum {...};
public static readonly SmartEnum DOG = new SmartEnum {...};
}
// Usage
SmartEnum pet = SmartEnum.CAT;
Hogy szebb legyen, pl. definiálhatod az IEquatable-t, vagy definiálhatsz Id alapján egy implicit operator int-et, mert az alapján tudsz switch-case-t rakni. De vigyázz, ez esetben gondolj ennek mellékhatásaira is!
Ahogy előttem írták van erre gy Smart Enum pattern.
Ez a lényege, hogy csinálsz egy privát konstruktoros egyedi osztályt és publikus statikus readonly membereket adsz meg neki.
Erről itt tudhadsz meg többet.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!