Sdílet prostřednictvím


Obecné třídy (Průvodce programováním v 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 Obecné typy v knihovně tříd rozhraní .NET Framework (Průvodce programováním v 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í parametrů typů (Průvodce programováním v 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 kde T je typ třídy.

Příklad jednoduchého Obecná třída, viz Úvod do obecných typů (Průvodce programováním v 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

Obecné typy (Průvodce programováním v C#)

System.Collections.Generic

Koncepty

Průvodce programováním v C#

Další zdroje

Uložení stavu výčtu

Dědičnosti Puzzle části jednoho