A castolás és a típuskonverzió két különböző módja annak, hogy egy kifejezést egyik adattípusból a másikba alakítsunk.
Egy kifejezést a (<type>) cast operátorral lehet egy másik típusra castolni.
long l = 1000L;
int i = (int)l;
object o = new Random();
Random r = (Random)o;
Ha a típusok nem kompatibilisek, InvalidCastException kivétel keletkezik. Számok esetén ez azt jelenti, hogy a fogadó típus nem tudja ábrázolni a castolt értéket. Osztályok esetén az egyik típusnak a másikból kell származnia (ez a struktúrákra is triviálisan igaz).
A castolás alternatívája a is operátort használó típuskonverzió. Ezt jellemzően referenciatípusokra és nullázható típusokra alkalmazzák.
object o = new Random();
if (o is Random rand)
{
int ii = rand.Next();
// now, do something random
}
Ha egy objektum pontos típusát kell megállapítanod, akkor az is lehet, hogy egy kicsit túl megengedő, mert igazat ad vissza egy osztályra és minden olyan osztályra és interfészre is, amelyből az közvetlenül vagy közvetve származik. Ebben az esetben a megoldást a typeof és az Object.GetType() jelenti.
object o = new List<int>();
o is ICollection<int> // true
o.GetType() == typeof(ICollection<int>) // false
o is List<int> // true
o.GetType() == typeof(List<int>) // true
A futballklubunk football-match-reports szárnyal a bajnokságokban, és ismét felkértek egy kis munkára, ezúttal a biztonsági belépőkártyák nyomtatási rendszerén.
A háttérszemélyzet osztályhierarchiája a következő:
TeamSupport (interface)
├ Chairman
├ Manager
└ Staff (abstract)
├ Physio
├ OffensiveCoach
├ GoalKeepingCoach
└ Security
├ SecurityJunior
├ SecurityIntern
└ PoliceLiaison
A hierarchia teljes implementációja a feladat forráskódjának részeként rendelkezésre áll.
A belépőkártya-készítőnek átadott összes adat ellenőrzött, és garantáltan nem null.
Kérlek, implementáld a SecurityPassMaker.GetDisplayName() metódust. A Staff-ból leszármazó összes osztály példányánál a Title mező értékét adja vissza, egyébként pedig a „Too Important for a Security Pass” szöveget.
var spm = new SecurityPassMaker();
spm.GetDisplayName(new Manager());
// => "Too Important for a Security Pass"
spm.GetDisplayName(new Physio());
// => "The Physio"
Kérlek, módosítsd a SecurityPassMaker.GetDisplayName() metódust. Úgy kell viselkednie, mint az 1. részfeladatban, azzal a kivétellel, hogy ha a személyzeti tag a biztonsági csapat tagja (akár Security típusú, akár annak valamelyik leszármazottja), akkor a cím után a „ Priority Personnel” szöveget kell megjeleníteni.
var spm = new SecurityPassMaker();
spm.GetDisplayName(new Physio());
// => "The Physio"
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior Priority Personnel"
Kérlek, módosítsd a SecurityPassMaker.GetDisplayName() metódust. Úgy kell viselkednie, mint a 2. részfeladatban, azzal a kivétellel, hogy a „ Priority Personnel” szöveget nem kell megjeleníteni a SecurityJunior, SecurityIntern és PoliceLiaison típusú példányok esetében.
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) C# nyelvet 62 fogalom178 feladat segítségével, valódi emberi mentorálással, mindez ingyen.