2008-10-23 12 views
34

Czy typ interfejsu ogólnego może być oparty na określonej klasie nadrzędnej?Czy generics C# mogą mieć określony typ podstawowy?

Na przykład:

public interface IGenericFace<T : BaseClass> 
{ 
} 

Oczywiście powyższy kod nie działa, ale gdyby tak się stało, co próbuję powiedzieć, że kompilator T musi być podklasa BaseClass. Czy można to zrobić, czy są na to plany itp.?

Myślę, że byłby przydatny w odniesieniu do konkretnego projektu, upewniając się, że ogólny interfejs/klasa nie jest używany z niezamierzonymi typami w czasie kompilacji. Lub też, aby sortować własny dokument: pokaż, jakiego rodzaju jest przeznaczony.

Odpowiedz

81
public interface IGenericFace<T> where T : SomeBaseClass 
+2

można znaleźć więcej informacji o tym, jak ograniczyć typ na http://msdn.microsoft.com/en-us/library/d5x73970 (VS.80).aspx – tvanfosson

+0

@Kyralessa, czy to możliwe, aby mieć ogólną klasę bazową – Demodave

5

tak.

public interface IGenericFace<T> 
    where T : BaseClass 
{ 
} 
+4

to powinno zostać usunięte, nie widzę jak to jest dodawanie czegokolwiek - Kyralessa już na to odpowiedziała. –

59

co się odnosimy się nazywa "Generic Ograniczenia". Istnieje wiele ograniczeń, które można wprowadzić na typ ogólny.

Prostymi przykładami są następujące:

  • where T: struct - Typ argument musi być typu wartość. Dowolny typ wartości z wyjątkiem Nullable - można określić. Aby uzyskać więcej informacji, patrz Using Nullable Types (C# Programming Guide).

  • where T : class - Argument typu musi być typem odniesienia; dotyczy to również dowolnej klasy, interfejsu, delegata lub typu tablicy.

  • where T : new() - Argument type musi mieć publiczny konstruktor bez parametrów. Używane razem z innymi ograniczeniami musi określać ograniczenie na new().

  • where T : <base class name> - Argument typu musi pochodzić od określonej klasy bazowej.

  • where T : <interface name> - Argumentem typu musi być lub zaimplementować określony interfejs. Można określić wiele ograniczeń interfejsu. Interfejs ograniczający może być również ogólny.

  • where T : U - Argument typu podany dla T musi pochodzić z argumentu dostarczonego dla U. Nazywa się to ograniczeniem typu nagiego.

Mogą być również połączone ze sobą tak:

C#

public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { } 
public interface IGenericFace<T> where T : SomeBaseClass 

VB

Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New}) 
Public Interface IGenericInterface(Of T As SomeBaseClass) 
Powiązane problemy