2010-11-18 2 views
3

Я делал это раньше - просто не могу вспомнить трюк.Аннотация/Виртуальные участники для обеспечения общей и производной комбинированной функциональности - C#

Если у меня есть абстрактный класс:

общественного абстрактного класса Post

И множество вытекающих классов:

общественный класс Фото: Сообщение

Я хочу force классы для реализации метода Validate(), но в то же время предоставление ядро ​​ проверка на Post уровень.

я могу создать метод: общественности абстрактной пустоты Validate() в сообщении, который вынудит вытекающие классы для реализации методы, но тогда как я выполнить сообщение проверки (базовой)?

Конечный результат я хочу быть в состоянии сделать это:

public class BLL 
{ 
    public void AddPost(Post post) 
    { 
     post.Validate(); // includes "Post" validation, any deriving validation. 
     repository.Add(post); 
    } 
} 

Как я могу это сделать?

ответ

10

Вот то, что вы хотите:

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(); 
} 

Это заставит базовые классы для реализации методики проверки, и базы Validate будет вызван внешними пользователями.

Невозможно сделать реферат метода и предоставить реализацию по умолчанию.

+0

Ahhh - это все! Блестящие - приветствия. :) – RPM1984

+0

@RPM, рад помочь! – jjnguy

4

Создать публичный метод шаблона в базовом классе и его называют производный метод проверки класса:

public abstract class Post { 
    public void Validate() { 
     // Post validation 
     ValidateDerived(); 
    } 

    protected abstract void ValidateDerived(); 
} 

Это заставляет производных классы для реализации методы, но и обеспечивает общую логику проверки для класса Post. Обратите внимание: Validate() не является виртуальным. Это безопаснее, чем заставить производные классы запоминать вызов base.Validate().

+0

Разве это отличается от моего ответа? – jjnguy

+1

Нет разницы. Твоего ответа не было, когда я начал отвечать на вопрос. Я поддержал ваш ответ, чтобы быть вежливым. –

+0

Я возвращу пользу. Я тоже не хотел звучать грубо. Мне было просто любопытно, если бы вы имели в виду нечто иное, чем то, что я опубликовал. – jjnguy

Смежные вопросы