Когда следует вызывать base.Method () в переопределенном методе, и как пометить это, когда вы пишете код в команде? - PullRequest
24 голосов
/ 18 января 2011

При использовании некоторого framework / api иногда довольно непонятно, нужно ли вам вызывать base.Method, если вы переопределяете его, например, вы можете быть совершенно уверены, что вы должны вызывать base.Maethod (), когда вы переопределяете invocater события, чтобыраспространять событие, в других ситуациях это может быть не очень понятно, особенно когда нет доступного исходного кода и нет комментариев.

Мне интересно, как другие программисты решают, следует ли им вызывать базовый метод или нет в этой ситуации, и если вы собираетесь написать какую-то платформу, как сообщить другим программистам, что вы ожидаете, что базовый метод будет вызываться или нет в виртуальных членах.

Ответы [ 3 ]

19 голосов
/ 05 мая 2012

В настоящее время я не думаю, что потребители класса, которые переопределяют метод, должны когда-либо вызывать base.Method ().Код должен быть написан так, чтобы его нельзя было взломать.

public class MyBase
{
    private void FooInternal()
    {
        DoRequiredStuff();
        Foo();
    }
    public virtual void Foo() {}
}
9 голосов
/ 05 мая 2012

Если вы требуете, чтобы потребители вашего класса ДОЛЖНЫ реализовывать функциональность определенного метода, этот метод должен быть помечен как абстрактный.

Если потребители вашего класса могут по желанию предоставлять функциональные возможности определенного метода, этот метод должен быть виртуальным.

В действительности нет никакого способа требовать, чтобы потребитель класса вызывал base.Method () для виртуального метода. Это действительно зависит от контекста. Если base.Method () выполняет какую-то работу, которую в противном случае вам пришлось бы выполнять, то вы должны вызывать base.Method (), если это сэкономит вам время на разработку / в этом контексте имеет смысл.

7 голосов
/ 18 января 2011

Это зависит от того, должна ли использоваться базовая функциональность.

Например, если базовый объект имеет некоторые общие функции базы данных, которые необходимо запустить, вызовите базовый метод в конце.Если ваш код перезаписывает некоторые свойства, которые будет устанавливать базовый метод, лучше сначала вызвать базовый метод.

Если исходный код или документация отсутствуют, используйте .Net Reflector RedGate (http://www.red -gate.com /products / dotnet-development / рефлектор /) может просто распаковать сборки, которые вы пытаетесь использовать, и посмотреть, как работает код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...