Lo que básicamente deseo hacer es diseñar una interfaz genérica que, cuando se implementa, da como resultado una clase que puede comportarse exactamente como T, excepto que tiene alguna funcionalidad adicional. Aquí está un ejemplo de lo que estoy hablando:Interfaces C#: ¿Es posible hacer referencia al tipo que implementa la interfaz dentro de la interfaz?
public interface ICoolInterface<T>
{
T Value { get; set; }
T DoSomethingCool();
}
public class CoolInt : ICoolInterface<int>
{
private int _value;
public CoolInt(int value)
{
_value = value;
}
public int Value
{
get { return _value; }
set { _value = value; }
}
public int DoSomethingCool()
{
return _value * _value;
// Ok, so that wasn't THAT cool
}
}
Y esto es todo muy bien, pero con el fin de utilizar CoolInt, tengo que hacer algo como esto:
CoolInt myCoolInt = new CoolInt(5);
int myInt = myCoolInt.Value;
I más bien, en términos de asignación al menos, que CoolInt funciona igual que int. En otras palabras:
CoolInt myCoolInt = 5;
int myInt = myCoolInt;
Para lograr esto, añaden estos dos operadores de conversión a mi clase CoolInt:
public static implicit operator CoolInt(int val)
{
return new CoolInt(val);
}
public static implicit operator int(CoolInt obj)
{
return obj.Value;
}
Funciona increíblemente. Ahora, preferiría que pudiera agregar estas dos sobrecargas a la interfaz, de modo que los implementadores de la interfaz sean forzados para implementar estos operadores. El problema es que los prototipos de estos operadores se refieren directamente a CoolInt.
C# tiene muchos nombres de "marcadores de posición" para cosas que están implícitamente definidas o que aún no se han definido. La T que se usa convencionalmente en la programación genérica es un ejemplo. Supongo que la palabra clave value, utilizada en Properties, es otra. La referencia "this" podría considerarse otra. Espero que haya otro símbolo que pueda usar en mi interfaz para indicar "el tipo de la clase que está implementando esta interfaz", p. "implementador".
public static implicit operator implementer(int val)
{
return new IntVal(val);
}
public static implicit operator int(implementer obj)
{
return obj.Value;
}
¿Esto es posible?
sí, es extraño cómo la sobrecarga del operador a veces no funciona: ¡en el ejemplo genérico abstracto que publiqué aquí parece funcionar de una manera pero no de la otra! –