Obecný tříd (Příručka programování C#)
Obecný tříd zapouzdřit operací, které nejsou specifické pro určitý datový typ.Nejčastěji obecný tříd je kolekce jako propojené seznamy, tabulky hash, zásobníky, fronty, stromy a podobně.V podstatě stejným způsobem bez ohledu na typ dat uloženy jsou prováděny operace, jako je přidávání a odebírání položek z kolekce.
Většině scénářů, které vyžadují kolekce tříd, je doporučeno použít předdefinována v.NET Framework, knihovna tříd.Další informace o použití těchto tříd naleznete v Generics v.NET Framework, knihovna tříd (Příručka programování C#).
Obvykle vytvoříte třídy obecný počínaje existující třídy betonu a změna typů do parametry typu jeden v době, dokud dosáhnout optimální rovnováhy Generalizace a použitelnosti.Při vytváření vlastní třídy obecný důležité následující:
Které typy generalize do parametrů typu.
Jako pravidlo, další typy, které lze parametrizovat, více flexibilní a opakovaně se stane kódu.Příliš mnoho generalizace však můžete vytvořit kód, který je pro ostatní vývojáři číst a porozumět.
Jaká omezení, případně použít parametry typu (viz Omezení na typ parametrů (Příručka programování C#)).
Dobré pravidlo se použije na maximální možné omezení, která přesto umožňují zpracovat typy, které musí zpracovat.Pokud víte, že obecná třída je určena pro použití pouze s typy odkazů, platí omezení třídy.Zabráníte neúmyslnému použití třídy s typy hodnot a umožňují používat as operátor na Ta zkontrolujte, zda hodnoty null.
Určuje, zda obecné chování faktor do základní třídy a podtřídy.
Protože obecný tříd mohou sloužit jako základní třídy, platí zde stejné faktory ovlivňující návrh jako obecné třídy.Viz pravidla o dědění obecný základní třídy dále v tomto tématu.
Zda implementovat obecný jedno nebo více rozhraní.
Například třída, která bude použita k vytvoření položek v kolekci generics navrhujete, budete muset implementovat rozhraní jako IComparable<T> kde T je typ třídy.
Příklad jednoduchého Obecná třída, viz Úvod do Generics (Příručka programování C#).
Pravidla pro omezení a parametry typu mají několik důsledky pro obecná třída chování, zejména pokud jde o usnadnění dědičnosti a člen.Než budete pokračovat, měli byste pochopit některé podmínky.Obecná třída Node<T>, Klientský kód může odkazovat na třídu buď zadáním argumentu typ, vytvoření uzavřeného typu vyrobeno (Node<int>).Případně jej můžete nechat parametr typ neuvedete, například když zadáte obecné základní třídy, vytvoření otevřeného vyrobeno typu (Node<T>).Obecný třídy přebírají betonu, uzavřené postaveny nebo otevřít vypočtené základních tříd:
class BaseNode { }
class BaseNodeGeneric<T> { }
// concrete type
class NodeConcrete<T> : BaseNode { }
//closed constructed type
class NodeClosed<T> : BaseNodeGeneric<int> { }
//open constructed type
class NodeOpen<T> : BaseNodeGeneric<T> { }
Protože neexistuje způsob běhu kódu klienta zadat argument typ potřebné k vytvoření instance třídy základní než obecné, jinými slovy, beton, tříd může zdědit z uzavřené postavena základní třídy, ale není otevřít vypočtené třídy nebo parametry typu.
//No error
class Node1 : BaseNodeGeneric<int> { }
//Generates an error
//class Node2 : BaseNodeGeneric<T> {}
//Generates an error
//class Node3 : T {}
Obecný tříd, které dědí z otevřené vyrobeno typy musíte zadat argumenty typu pro všechny parametry typu základní třídy, které nejsou sdíleny zdědění třída ukázáno v následujícím kódu:
class BaseNodeMultiple<T, U> { }
//No error
class Node4<T> : BaseNodeMultiple<T, int> { }
//No error
class Node5<T, U> : BaseNodeMultiple<T, U> { }
//Generates an error
//class Node6<T> : BaseNodeMultiple<T, U> {}
Obecný tříd, které dědí z otevřené vyrobeno typy musí určit omezení, která jsou množinou nebo neznamená omezení na základní typ:
class NodeItem<T> where T : System.IComparable<T>, new() { }
class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }
Obecné typy lze použít více parametrů typu a omezení:
class SuperKeyType<K, V, U>
where U : System.IComparable<U>
where V : new()
{ }
Otevřít vypočtené vyrobeno a uzavřené typy lze použít jako parametry metody:
void Swap<T>(List<T> list1, List<T> list2)
{
//code to swap items
}
void Swap(List<int> list1, List<int> list2)
{
//code to swap items
}
Pokud Obecná třída implementuje rozhraní, můžete všechny instance dané třídy přetypovat na rozhraní.
Obecný třídy jsou výchozí.Jinými slovy Pokud je vstupní parametr určuje List<BaseClass>, pokud chcete poskytnout zobrazí chyba kompilace List<DerivedClass>.
Viz také
Referenční dokumentace
Generics (Příručka programování C#)