Klasy ogólne (Przewodnik programowania w języku 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 Typy ogólne w bibliotece klas programu .NET Framework (Przewodnik programowania w języku 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 dotyczące parametrów typu (Przewodnik programowania w języku 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 gdzie T jest typem klasy.
Na przykład prostą klasę rodzajowy, zobacz Wprowadzenie do typów ogólnych (Przewodnik programowania w języku 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
Typy ogólne (Przewodnik programowania w języku C#)
Koncepcje
Przewodnik programowania w języku C#