Udostępnij za pośrednictwem


Klas rodzajowych (Podręcznik programowania C#)

Klasy rodzajowy hermetyzowania operacje, które nie są specyficzne dla określonego typu danych.Najczęściej dla klas rodzajowych jest z kolekcji, takich jak listy łączone, tabel mieszania, stosy, kolejek, drzew i itd.Operacje, takie jak dodawanie i usuwanie elementów z kolekcji są wykonywane w zasadniczo taki sam sposób niezależnie od typu przechowywanych danych.

Dla większości scenariuszy, które wymagają gromadzenia klas, podejście zalecane jest użycie jednego z dostarczanych w.NET Framework class library.Aby uzyskać więcej informacji na temat używania tych klas zobacz Generyczne w.NET Framework Class Library (Podręcznik programowania C#).

Zazwyczaj Tworzenie klas rodzajowych począwszy od istniejącej klasy konkretnych i zmienianie typów do parametrów typu one w czasie, do momentu osiągnięcia optymalnej równowagi Generalizacja i użyteczność.Podczas tworzenia własnych klas rodzajowych, istotne kwestie są następujące:

  • Jakie typy uogólniać do parametrów typu.

    Jako regułę, więcej typów, które można parameterize, bardziej elastyczne i wielokrotnego użytku staje się kodu.Jednakże zbyt dużo generalizacji można utworzyć kod, który jest trudne dla innych programistów do odczytu lub zrozumieć.

  • Jakie ograniczenia, jeśli istnieje, aby zastosować do parametrów typu (patrz Ograniczenia parametrów typu (Podręcznik programowania C#)).

    Dobra reguła stosuje się maksymalną ograniczenia możliwości pozwalających będzie nadal obsługiwać typy, które muszą obsługiwać.Na przykład jeśli wiadomo, że klasa rodzajowy jest przeznaczony do użytku tylko z typami odwołań, stosuje się ograniczenia klasy.Uniemożliwi niezamierzone korzystanie z klasy z typów wartości i umożliwi użytkownikowi korzystanie z as operator na Ti sprawdź, czy wartości null.

  • Określa, czy współczynnik ogólne zachowanie do podstawowych klas i podklas.

    Ponieważ klasy rodzajowe mogą służyć jako podstawowych klas, tym samym uwagi dotyczące projektowania stosuje się tutaj jako z-uniwersalne klas.Zobacz zasady dotyczące dziedziczy z klasy podstawowej rodzajowe w dalszej części tego tematu.

  • Określa, czy zaimplementować jeden lub więcej interfejsów rodzajowy.

    Na przykład, jeśli projektowany klasy, używany do tworzenia elementów w kolekcji oparte generyczne może trzeba zaimplementować interfejsu, takich jak IComparable<T> gdzie T jest typem klasy.

Na przykład prostą klasę rodzajowy, zobacz Wprowadzenie do generyczne (Podręcznik programowania C#).

Zasady dotyczące parametrów typu i ograniczenia mają kilka wpływ na zachowanie klasą rodzajową, szczególnie w odniesieniu do dostępności dziedziczenia i elementu członkowskiego.Przed kontynuowaniem, należy zrozumieć niektóre terminy.Rodzajowy klasy Node<T>, kod klienta można odwołać klasy albo przez określenie argumentu typu, do utworzenia typu zamkniętych konstruowanej (Node<int>).Alternatywnie, można go pozostawić parametru typu nie określono tego parametru, na przykład po określeniu rodzajowy klasy podstawowej, do tworzenia otwartego zbudowane typu (Node<T>).Rodzajowy klasy mogą dziedziczyć beton, zamkniętych zbudowane lub Otwórz konstruowanej klas podstawowych:

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> { }

Non rodzajowy, innymi słowy, beton, klas można dziedziczyć z zamkniętych konstruowanej klas podstawowych, ale nie z otwartych klas skonstruowane lub parametrów typu, ponieważ w czasie wykonywania kodu klienta do dostarczania argumentu typu wymagane do utworzenia wystąpienia klasy bazowej nie ma możliwości.

//No error
class Node1 : BaseNodeGeneric<int> { }

//Generates an error
//class Node2 : BaseNodeGeneric<T> {}

//Generates an error
//class Node3 : T {}

Rodzajowy klas, które dziedziczą z otwartych typów konstruowanej musi dostarczyć argumentów typu dla parametrów typu klasy podstawowej, które nie są udostępnione przez dziedziczące klasy, jak pokazano w poniższym kodzie:

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> {} 

Rodzajowy klas, które dziedziczą z otwartych typów konstruowanej musi określić ograniczenia, które są podzbiorem lub pociąga za sobą, ograniczenia dotyczące typu podstawowego:

class NodeItem<T> where T : System.IComparable<T>, new() { }
class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }

Typy rodzajowe można użyć wielu parametrów typu i ograniczeń, w następujący sposób:

class SuperKeyType<K, V, U>
    where U : System.IComparable<U>
    where V : new()
{ }

Otwórz skonstruowane i zamknięte typy konstruowanej mogą służyć 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
}

Jeśli klasą rodzajową implementuje interfejs, wszystkich wystąpień tej klasy można oddać do tego interfejsu.

Klasy rodzajowe są niezmienne.Innymi słowy Jeśli parametr wejściowy Określa List<BaseClass>, otrzymasz błąd kompilacji, jeśli zapewniają List<DerivedClass>.

Zobacz też

Informacje

Generyczne (Podręcznik programowania C#)

System.Collections.Generic

Koncepcje

Podręcznik programowania C#

Inne zasoby

Zapisywanie stanu moduły wyliczające

Puzzle dziedziczenie części jednej