Abstract / Miembros virtual para proporcionar funcionalidad combinada Común y Derivados - C #
-
26-09-2019 - |
Pregunta
Yo he hecho esto antes -. Simplemente no pueden recordar el truco
Si tengo un Extracto clase:
clase abstracta pública del anuncio
Y un conjunto de deriva clases:
public class Foto: Mensaje
Quiero fuerza las clases derivadas para poner en práctica un método llamado Validar () , pero al mismo tiempo, proporcionar core la validación en el post nivel.
Me puede crear un método: pública abstract void Validar () en Post , lo que obligaría a las clases derivadas para poner en práctica el método, pero entonces ¿Cómo se realiza la post (base) de validación?
El resultado final es que quiero ser capaz de hacer esto:
public class BLL
{
public void AddPost(Post post)
{
post.Validate(); // includes "Post" validation, any deriving validation.
repository.Add(post);
}
}
¿Cómo puedo hacerlo?
Solución
Esto es lo que desea:
public abstract class Post {
// Default validation technique
public void Validate()
{
// your base validation
// Then call the specific validation technique
ExtraValidate();
}
// Forces subclasses to provide validation technique
protected abstract void ExtraValidate();
}
Esto obligará a las clases base para implementar una técnica de validación, y la base Validar será llamado por los usuarios externos.
Es imposible hacer un método abstracto, y proporcionar una implementación por defecto.
Otros consejos
Crear un método de plantillas públicas en la clase base y tienen que llamar al método de validación clase derivada:
public abstract class Post {
public void Validate() {
// Post validation
ValidateDerived();
}
protected abstract void ValidateDerived();
}
Esto obliga a derivar clases para implementar el método, sino que proporciona la lógica de validación común para la clase Post. Tenga en cuenta que Validar () no es virtual en sí. Esto es más seguro que las clases derivadas obligando a tener que recordar llamar base.Validate ().