Necesito definir una interfaz que debe imponer ciertas sobrecargas al operador a los tipos que lo implementan. No parece una forma obvia de hacerlo, ya que la sobrecarga del operador debe hacerse usando métodos estáticos en clase. ¿Hay alguna forma de lograr el mismo efecto (usando clases abstractas o cualquier otra cosa)?¿Hay alguna forma en C# para forzar la sobrecarga del operador en clases derivadas?
Respuesta
poco de un truco, pero ...
Usted puede proporcionar sobrecargas de operadores en su clase base que luego llamar a algunos métodos abstractos publicados en una de las clases para hacer el trabajo allí.
public abstract class MyClass
{
public static MyClass operator +(MyClass c1, MyClass c2)
{
return c1.__DoAddition(c2);
}
protected abstract MyClass __DoAddition(MyClass c2);
}
No. La única forma sensata de hacer esto sería hacer que un test de prueba de unidad use la reflexión para encontrar todas las implementaciones concretas, y luego verificar esta condición. Puede también hacer algo en el tiempo de ejecución re lo mismo a través de un constructor estático, pero entonces la pregunta es que constructor estático?
Otro enfoque es abandonar los operadores y utilizar un enfoque basado en interfaz; por ejemplo, si necesita T
para tener +(T,T)
, en lugar de que los operadores tengan una interfaz con un método Add(T)
. Otra ventaja aquí es que las interfaces se pueden usar desde genéricos (generalmente a través de restricciones), donde-como el uso de operadores de código genérico requiere un poco de esfuerzo.
métodos utilizando como sumar, restar es próxima elección obvia pero desde mi código tendrá muchos cálculos como 's = s1 * 2 + s2 * s3 - s4 * (s5 - s6);'. El uso de métodos lo hará 's = s1.Multiplicar (2) .Add (s2.Multiplicar (s3)). Restar (s4.Multiplicar (s5.Subtract (s6)));' ¡Ciertamente no muy legible! – Hemant
@Hemant: Puede usar el apóstrofo 'para resaltar el código en los comentarios también – abatishchev
@abatishchev solucionó eso; p –
Puede implementar la sobrecarga en una clase base abstracta, pero delegue los detalles de la operación real en un método abstracto. Entonces esto tendrá que implementarse y la sobrecarga se aplicará con su implementación.
public abstract class OverLoadingBase
{
public abstract OverLoadingBase DoAdd(OverLoadingBase y);
public static OverLoadingBase operator +(OverLoadingBase x, OverLoadingBase y)
{
return x.DoAdd(y);
}
}
Aunque no estoy seguro de si esto está completo.
@abatishchev - Tengo curiosidad - ¿por qué cambia el formato de la llave? –
Como su operador solo se puede sobrecargar y no anular, es bastante difícil. La mejor solución que puedo pensar es utilizar una clase abstracta y sobrecargarla así.
public abstract class MyBase
{
public abstract MyBase Add(MyBase right);
public abstract MyBase Subtract(MyBase right);
public static MyBase operator +(MyBase x, MyBase y)
{
//validation here
return x.Add(y);
}
public static MyBase operator -(MyBase x, MyBase y)
{
//validation here
return x.Subtract(y);
}
}
he hecho esto en el pasado ...
public abstract class BaseClass<TClass> where TClass : BaseClass
{
public static TClass operator +(TClass c1, TClass c2)
{
return c1.DoAddition(c2);
}
protected abstract TClass DoAddition(TClass c2);
}
Y luego implementado de la siguiente manera:
public class ConcreteClass : BaseClass<ConcreteClass>
{
protected ConcreteClass DoAddition(ConcreteClass c2)
{
...
}
}
- 1. Sobrecarga del operador + en C++
- 2. Sobrecarga del operador en C++
- 3. sobrecarga del operador C++
- 4. C# Clase abstracta Sobrecarga del operador
- 5. Operador = sobrecarga en C++
- 6. C++ sobrecarga del operador estático
- 7. C++ volátil y sobrecarga del operador para la aplicación CUDA
- 8. C# en el operador-sobrecarga
- 9. Sobrecarga y sobrecarga del operador en Java
- 10. Simpler "Prevenir clases derivadas" en C++
- 11. operador de asignación sobrecarga en C#
- 12. Espacios de nombres y sobrecarga del operador en C++
- 13. Sobrecarga del operador en Clojure
- 14. Sobrecarga del operador en Java
- 15. Sobrecarga del operador en .NET
- 16. valor de retorno de la sobrecarga del operador en C++
- 17. Reglas para cuándo usar la sobrecarga del operador en python
- 18. ¿Por qué la sobrecarga del operador no está disponible para las clases en Delphi?
- 19. Sobrecarga del operador en plantillas de clase
- 20. Sobrecarga del operador
- 21. operador de asignación sobrecarga en C++
- 22. ¿Sobrecarga del operador?
- 23. C++ operador == sobrecarga
- 24. Sobrecarga elegante del operador en D
- 25. ¿Hay alguna sobrecarga en tiempo de ejecución para leer solo?
- 26. cómo forzar a los constructores de la clase base a llamar en clases derivadas?
- 27. C++ sobrecarga operador de asignación
- 28. Sobrecarga del operador C++ para operaciones con números complejos
- 29. operador con plantilla() sobrecarga C++
- 30. C++ plantilla amigo operador sobrecarga
'abstract protected' en lugar de' private abstract', supongo .. – abatishchev
No es bueno, pero es efectivo. También lo estoy haciendo de esta manera. – elsni
@abatishchev: gracias, gracias :) – Codesleuth