Има ли смисъл внедряването на интерфейс както имплицитно, така и явно?

В момента уча за моя изпит MS 70-515. В една от практиките авторът прилага интерфейс както имплицитно, така и експлицитно. Изричното изпълнение просто извиква имплицитното изпълнение. Изричното изпълнение е просто посочено без обяснение.

Има ли смисъл да има както имплицитна, така и експлицитна реализация на интерфейса? Мисля, че изричното внедряване е излишно (в този случай).

public class PassTextBox : TextBox, IScriptControl
{
    public virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        var descriptor = new ScriptControlDescriptor(
            "AjaxEnabled.PassTextBox", ClientID);
        // ...
        return new ScriptDescriptor[] {descriptor};
    }

    IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors()
    {
        return GetScriptDescriptors();
    }
}

Между другото, изглежда, че кодът работи добре без изричната реализация, тъй като имплицитната реализация е публична.

Отнася се за Комплект за обучение на MCTS за самостоятелно обучение (изпит 70-515): Разработка на уеб приложения с Microsoft . NET Framework 4Глава 9, Урок 2, Практика 3, за да бъдем точни.


person comecme    schedule 15.04.2012    source източник
comment
възможен дубликат на Имплицитно и явно внедряване на интерфейс   -  person M.Babcock    schedule 15.04.2012
comment
Тези изпити винаги имат грешка, дълга една миля. Можете да изпратите свой собствен: oreilly.com/catalog/errata.csp?isbn=9780735627406   -  person Hans Passant    schedule 16.04.2012


Отговори (1)


Изричното имплементиране изглежда напълно излишно.

Не мога да измисля начин да го нарека, когато би имало значение, ако го изпуснете.

Има една малка разлика, неявната версия е виртуална, което означава, че може да бъде заменена. Явната версия винаги ще се извиква в тази входна точка. Но тъй като извиква само виртуалния член, тази разлика не се използва тук.

person Henk Holterman    schedule 15.04.2012
comment
Марк Гравел казва, че една от причините да се внедрят и двете може да е неизричният метод е virtual или abstract, за подкласове към override. В моя пример това наистина е virtual, но не виждам защо това би било причина също да внедря изричния интерфейс. Ще попитам Марк какво има предвид, като коментира отговора си. - person comecme; 15.04.2012
comment
Може да имате 2 напълно различни реализации. Но дали това е желателно? И когато се използва това, би било по-разумно да поставите внедряването в изрично и виртуалният метод да извика това. - person Henk Holterman; 16.04.2012
comment
@Henk: ако виртуалната версия ще бъде заменена в производен клас и екземпляр на този клас ще бъде извикан чрез интерфейсна променлива, коя версия ще бъде извикана? Ще бъде ли извикана изричната версия в първия клас? И коя версия на имплицитната реализация ще бъде изпълнена? Първоначалната версия или заменената версия? - person comecme; 16.04.2012
comment
Когато извиквате чрез интерфейсна var, тя винаги отива към изричната реализация. С обектна променлива (базова или производна) винаги към имплицитното. - person Henk Holterman; 16.04.2012