Аннотация / Виртуальные члены для обеспечения общей и производной комбинированной функциональности - C # - PullRequest
3 голосов
/ 19 ноября 2010

Я делал это раньше - просто не могу вспомнить трюк.

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

открытый абстрактный класс Post

И набор производных классов:

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

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

Я могу создать метод: public abstract void Validate () in Post , который заставит производные классы реализовать метод, но как мне выполнить Post (base) validation?

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

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

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

Ответы [ 2 ]

10 голосов
/ 19 ноября 2010

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

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 будет вызываться внешними пользователями.сделать метод абстрактным и предоставить реализацию по умолчанию.

4 голосов
/ 19 ноября 2010

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

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

    protected abstract void ValidateDerived();
}

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

...