Подтвердить что ты не робот

Когда вы должны вызвать метод base.Method() в переопределенном методе и как это отметить, когда вы пишете код в команде?

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

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

4b9b3361

Ответ 1

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

public class MyBase
{
    private void FooInternal()
    {
        DoRequiredStuff();
        Foo();
    }
    public virtual void Foo() {}
}

Ответ 2

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

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

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

Ответ 3

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

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

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