with variable parameter multiple method interfaces generic example create clase c# generics parameters restrictions

c# - variable - Restringir el parámetro genérico en la interfaz a la subclase



method with generic parameter c# (2)

Lo siguiente es contundente, pero tengan paciencia conmigo:

interface Clonable<TSubClass> { TSubClass Clone(); }

¿Cómo puedo restringir que TSubClass sea del tipo de implementación?

es decir, solo deje que el implementador haga esto:

class Dog : Clonable<Dog> { Dog Clone() { .... } }

No esta:

class BadDog : Clonable<Rabbit> { Rabbit Clone() { .... } }


No puede hacer cumplir eso, solo a través de convenciones y documentación ...

La convención para mí sería usar algo como TSelf .

interface ICloneable<TSelf> where TSelf : ICloneable<TSelf> { ... }

También tenga en cuenta que cualquier construcción no concreta que implemente o herede esta interfaz debe pasar la restricción a través de ...

[Serializable] abstract class SerializableCloneable<TSelf> : ICloneable<TSelf> where TSelf : SerializableCloneable<TSelf> { ... }

Nota : Implementé esta comprobación en NRoles utilizando la convención de llamar a su parámetro de tipo propio S


No se puede aplicar eso en tiempo de compilación, porque los genéricos .NET no tienen especialización de plantilla o tipado de pato.

Sin embargo, puede incluir un constructor estático (tipo inicializador) que utiliza la reflexión para afirmar la relación en el momento de la carga. Ok, C # no te permite poner un constructor estático en una interfaz (aunque .NET sí lo permite), así que necesitarías usar un inicializador de módulo o una función que tú mismo llamas. Además, deberá buscar los tipos que implementan la interfaz, incluidos los tipos que todavía no están cargados (puede suscribirse al evento Assembly.Load para recibir notificaciones de los tipos cargados en el futuro).