Membros abstratos/virtuais para fornecer funcionalidade combinada comum e derivada - C#
-
26-09-2019 - |
Pergunta
Eu já fiz isso antes - simplesmente não consigo me lembrar do truque.
Se eu tiver um abstrato classe:
Postagem de classe abstrata pública
E um conjunto de derivando Aulas:
Foto de aula pública: POST
Eu quero força as classes derivadas para implementar um método chamado Validar(), mas ao mesmo tempo fornecendo essencial Validação no Publicar nível.
Eu posso criar um método: Validate de vazio resumo público () dentro Publicar, que forçaria as classes derivadas a implementar o método, mas como faço para executar o Publicar (base) Validação?
O resultado final é que eu quero poder fazer isso:
public class BLL
{
public void AddPost(Post post)
{
post.Validate(); // includes "Post" validation, any deriving validation.
repository.Add(post);
}
}
Como eu posso fazer isso?
Solução
Aqui está o que você quer:
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();
}
Isso forçará as classes base a implementar uma técnica de validação, e o validador base será chamado por usuários externos.
É impossível fazer um método abstrato e fornecer uma implementação padrão.
Outras dicas
Crie um método de modelo público na classe Base e faça com que ele chame o método de validação de classe derivada:
public abstract class Post {
public void Validate() {
// Post validation
ValidateDerived();
}
protected abstract void ValidateDerived();
}
Isso força as classes derivadas a implementar o método, mas fornece lógica de validação comum para a classe pós. Observe que o validate () não é o próprio virtual. Isso é mais seguro do que forçar as classes derivadas a se lembrar de ligar para base.Validate ().