Sdílet prostřednictvím


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#)

System.Collections.Generic

Koncepty

Příručka programování C#

Další zdroje

Uložení stavu výčtu

Dědičnosti Puzzle části jednoho