¿Hay alguna manera de agregar una función virtual que todas las clases heredadas deben anular? Entonces, ¿la combinación de lo virtual y lo abstracto? Tengo una situación en la que cada clase heredada debe realizar un procesamiento específico antes de que se ejecute algún código genérico. Las funciones virtuales no funcionan porque no aseguran que las clases heredadas las anulen. Y la función abstracta no puede tener una implementación predeterminada. Actualmente mi solución alternativa es implementar otra función protegida en la clase base que contiene el código común/genérico y se llama en la función abstracta omitidaC# Función abstracta con implementación posible?
Respuesta
No es posible tener un método que sea abstracto y virtual.
Si es posible, se puede dividir su método en un "antes" y "después" de parte:
public void DoWork()
{
DoBeforeWork();
DoCommonWork();
DoAfterWork();
}
protected abstract void DoBeforeWork();
protected abstract void DoAfterWork();
private void DoCommonWork() { ... }
lo contrario, su solución con un segundo método protegido es una muy buena idea:
public void DoWork()
{
DoActualWork();
}
protected abstract void DoActualWork(); // expected to call DoCommonWork
protected void DoCommonWork() { ... }
Puede verificar si DoCommonWork realmente fue llamado en DoWork usando un campo local de subprocesos si es necesario.
Sin embargo, probablemente sea mejor que el método sea virtual. Si la clase derivada no quiere añadir nada a la parte común, no debería tener que:
public virtual void DoWork() { ... }
Una vez más, se puede comprobar si la parte común se llama realmente.
+1 para su primer ejemplo, aunque estuvo casi tentado de ir -1 por el segundo porque es increíblemente peligroso y tan inseguro como el problema original. En lugar de tener que recordar anular una función virtual, ahora debemos recordar llamar a DoCommonWork desde la función abstracta. Su primer ejemplo mitiga cualquiera de este riesgo. – Will
Creo que voy por su primera sugerencia.Esta construcción es segura ya que se garantiza que se llamará al código común y la función abstracta DoBeforeWork debe implementarse en las clases derivadas. – Tin
Creo que podría estar buscando un template method: Implemente un método en su clase base que llame a un método abstracto como parte de su implementación. Las clases derivadas pueden implementar el método abstracto, pero esto permite que la clase base haga "algún procesamiento específico" antes de que se ejecute este método.
; Esta solución funciona bien para el postprocesamiento (primer código común que el código específico de clase derivada) pero necesito lo contrario: primero el código específico de la clase derivada seguido de código genérico. – Tin
Mi sugerencia es dividir la clase base en dos: clases una abstracta y una concreta sellada.
Ejemplo
que se supone que tiene clase base que se parece a lo siguiente:
public class BaseClass
{
public void DoProcessing()
{
// this method must be overriden in each subclass
}
}
Vamos a dividir a dos:
public abstract class BaseClass
{
protected abstract DoProcessingImlementation();
public void DoProcessing()
{
// here you can add program logic or just call overridden implementation
DoProcessingImplementation();
}
}
public sealed class DefaultBaseClassImplementation : BaseClass
{
public override DoProcessingImlementation()
{
// default implementation of method
}
}
Con este diseño si es necesario implementar nuevas lógica de procesamiento, usted hereda la nueva clase del BaseClass
y porque es abstracto debe implementar el método DoSomethigImplementation
. Para acceder a la lógica de procesamiento predeterminada, debe usar una instancia de la clase DefaultBaseClassImplementation
. Y que el DefaultBaseClassImplementation
está sellado no le permitirá heredar de la clase incorrecta.
- 1. abstracta implementación de interfaz explícita en C#
- 2. C# implementación anónima de la interfaz (o clase abstracta)
- 3. escribir la implementación C# de clase abstracta en línea?
- 4. ¿Cada función abstracta es virtual en C#, en general?
- 5. Ejemplos de implementación breve de interpretación abstracta
- 6. La función C++ no acepta la implementación concreta
- 7. delegado C# y clase abstracta
- 8. Clase abstracta con clase anidada, ¿es esto posible?
- 9. devolver una clase abstracta desde una función
- 10. clase abstracta Refactoring en C#
- 11. Implementación rápida/aproximación de la función pow() en C/C++
- 12. implementación de una función de anagrama en C#
- 13. Implementación de la mejor interfaz parcial C# en la clase básica/abstracta
- 14. C# Interfaz implementada por clase abstracta vacía
- 15. ¿Cómo envuelvo una interfaz C++ (clase abstracta) en C++/CLI?
- 16. Implementación dinámica para clase de interfaz/abstracta en Java
- 17. Interfaces y herencia de clase abstracta, implementación en clases ampliadas
- 18. Singleton y clase base abstracta en C++
- 19. C# campo estático clase abstracta herencia
- 20. Implementación PBKDF2 en C# con Rfc2898DeriveBytes
- 21. Método abstracto C# con implementación de clase base solamente?
- 22. implementación logsumexp en C?
- 23. Genéricos con parámetros genéricos y clase abstracta
- 24. ¿Es posible usar NGen con la implementación ClickOnce?
- 25. Implementación de Google OAuth con JQuery, ¿es posible?
- 26. R * ¿Implementación de C?
- 27. WPF con C++, ¿es posible?
- 28. php clase abstracta extendiendo otra clase abstracta
- 29. C# Clase abstracta Sobrecarga del operador
- 30. C++ error de parámetro clase abstracta solución
Si tiene una implementación predeterminada ¿por qué NECESITA ser anulada? ¿Eso no derrota el propósito? ¿Por qué no simplemente hacerlo abstracto si siempre va a ser anulado? –
Cuando anula la función, simplemente puede cambiar el cuerpo. no puedes cambiar la firma del método – Peyman