Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, afurmanov, Вы писали:
A>>Читатель класса Derived понимает, что DoWork() — специализирует Work(), в то время как Job() — расширяет набор операций базового класса. Иными словами DoWork() определяет специфику поведения операции Work() сохраняя инварианты присущие базовому классу, тогда как Job() — операция не присущая базовому классу, эта операция расширяет набор допустимых действий. Сравниваем с
A>>
A>>public class Derived : Base
A>>{
A>> public virtual void Job()
A>> {
A>> Console.WriteLine( "Derived.Job()" );
A>> }
A>>}
A>>
A>>Читателю класса не понять: Job() — расширяет или специализирует поведение? Т.е. надо посмотреть а что оно там в Base.
L>Пример некорректен.
Читателю FileLogger очевидно где есть имплементация, а где есть публичный интерфейс. В случае же с
FileLogger2, Write() — это что, имплементация или этот метод расширяет интерфейс ILogger2 ?
Здравствуйте, minorlogic, Вы писали:
M>Мне тоже в свое время хотелось узнать об преимуществах NVI , особенно в свете того что некоторые авторы советуют его применять ВСЕГДА когда есть виртуальная функция. M>К сожалению , внятной аргументации я тогда не получил.
Здравствуйте, <Аноним>, Вы писали:
А>Вот классическая реализация
А>
А>public class Base
А>{
А> public void DoWork()
А> {
А> CoreDoWork();
А> }
А> protected virtual void CoreDoWork()
А> {
А> Console.WriteLine( "Base.DoWork()" );
А> }
А>}
А>public class Derived : Base
А>{
А> protected override void CoreDoWork()
А> {
А> Console.WriteLine( "Derived.DoWork()" );
А> }
А>}
А>//Применение шаблона NVI
А>public class EntryPoint
А>{
А> static void Main()
А> {
А> Base b = new Derived();
А> b.DoWork();
А> }
А>}
А>
А>Чем такая реализация лучше этой? А>
А>public class Base
А>{
А> public virtual void DoWork()
А> {
А> Console.WriteLine( "Base.DoWork()" );
А> }
А>}
А>public class Derived : Base
А>{
А> public override void DoWork()
А> {
А> Console.WriteLine( "Derived.DoWork()" );
А> }
А>}
А>public class EntryPoint
А>{
А> static void Main()
А> {
А> Base b = new Derived();
А> b.DoWork();
А> }
А>}
А>
Несовсем корректный пример. Основная идея в том, что у вас есть некоторая общая последовательность действий, но с разными вариантами реализации. Например так:
Здравствуйте, Rutven, Вы писали:
R>Несовсем корректный пример. Основная идея в том, что у вас есть некоторая общая последовательность действий, но с разными вариантами реализации. Например так:
хъ
Я вот тоже так думал, но автор уже написал, что то такой пример называется уже не NVI, а "шаблонный метод" ("Template method").
Так что не катит... Насколько я понял, NVI — это когда реализация не-виртуальной функция базового класса не содержит ничего кроме вызова соответствующей виртуальной функции...
IMHO, смысл у такой реализации только один —
чтобы была возможность в последующем преобразовать ее в "полноценный" шаблонный метод.
Здравствуйте, bnk, Вы писали:
bnk>Здравствуйте, Rutven, Вы писали:
R>>Несовсем корректный пример. Основная идея в том, что у вас есть некоторая общая последовательность действий, но с разными вариантами реализации. Например так:
bnk>хъ
bnk>Я вот тоже так думал, но автор уже написал, что то такой пример называется уже не NVI, а "шаблонный метод" ("Template method"). bnk>Так что не катит... Насколько я понял, NVI — это когда реализация не-виртуальной функция базового класса не содержит bnk>ничего кроме вызова соответствующей виртуальной функции...
bnk>IMHO, смысл у такой реализации только один — bnk>чтобы была возможность в последующем преобразовать ее в "полноценный" шаблонный метод.
На самом деле, это я лоханулся , мой пример — это как раз Template method, а тот, что привели вы и есть NVI.
The template method is strongly related to the NVI (Non-Virtual Interface) pattern. The NVI pattern recognizes the benefits of a non-abstract method invoking the subordinate abstract methods. This level of indirection allows for pre and post operations relative to the abstract operations both immediately and with future unforseen changes.
, задача 18 — виртуальность). В нём отлично всё разъяснено. M>>Саттер вообще никакой внятной аргументации не приводит , даже без примеров.
_FR>Ты не прав. Начни читать на 119ой странице со слов _FR>
Открытая виртуальная функция вынуждена выполнять две работы…
_FR>Далее следует 120ая и 12ая страницы объяснений. Если ты их за доводы не считаешь, то извини
Я считаю что ИНОГДА NVI может быть полезен , но скорее как шаблонная функция. и уж точно он не полезен ВСЕГДА , в чем сатер пытается безуспешно читателей убедить.
Здравствуйте, minorlogic, Вы писали:
M>Я считаю что ИНОГДА NVI может быть полезен , но скорее как шаблонная функция. и уж точно он не полезен ВСЕГДА , в чем сатер пытается безуспешно читателей убедить.
А аргументировать "Я считаю" чем-либо, кроме как апперкэйсом по силам? Сказать, что, мол "старик ошибается, гонит и ваще он не прав" имеет возможность каждый и цена этому ноль и не интересно.
... << RSDN@Home 1.2.0 alpha rev. 675>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, minorlogic, Вы писали:
M>Я считаю что ИНОГДА NVI может быть полезен , но скорее как шаблонная функция. и уж точно он не полезен ВСЕГДА , в чем сатер пытается безуспешно читателей убедить.
То есть ты считаешь нормальным, что у класса Derived кто-угодно может вызвать вируальный методы из Base, несмотря на то, что он был перекрыт в Derived?
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, minorlogic, Вы писали:
M>>Я считаю что ИНОГДА NVI может быть полезен , но скорее как шаблонная функция. и уж точно он не полезен ВСЕГДА , в чем сатер пытается безуспешно читателей убедить.
L>То есть ты считаешь нормальным, что у класса Derived кто-угодно может вызвать вируальный методы из Base, несмотря на то, что он был перекрыт в Derived?
Я считаю что это замечательно иметь такую возможность !
Здравствуйте, _FRED_, Вы писали:
_FR>А аргументировать "Я считаю" чем-либо, кроме как апперкэйсом по силам? Сказать, что, мол "старик ошибается, гонит и ваще он не прав" имеет возможность каждый и цена этому ноль и не интересно.
Здравствуйте, minorlogic, Вы писали:
L>>То есть ты считаешь нормальным, что у класса Derived кто-угодно может вызвать вируальный методы из Base, несмотря на то, что он был перекрыт в Derived?
M>Я считаю что это замечательно иметь такую возможность !
Ну приплыли. Дай угадаю твое следующее желание — получить доступ к приватным членам?
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, minorlogic, Вы писали:
L>>>То есть ты считаешь нормальным, что у класса Derived кто-угодно может вызвать вируальный методы из Base, несмотря на то, что он был перекрыт в Derived?
M>>Я считаю что это замечательно иметь такую возможность !
L>Ну приплыли. Дай угадаю твое следующее желание — получить доступ к приватным членам?
Я могу тебя удивить , но и такая есть возможность в C++ . Вообще , я бы советовал не коверкать язык к неприспособленным конструкциям , а просто поменять язык.
Здравствуйте, minorlogic, Вы писали:
M>>>Я считаю что это замечательно иметь такую возможность !
L>>Ну приплыли. Дай угадаю твое следующее желание — получить доступ к приватным членам?
M>Я могу тебя удивить , но и такая есть возможность в C++ .
Фрэнды не считаются. Если бы вызов перекрытых методов был только для фрэндов, необходимости в NVI не возникло бы.
M>Вообще , я бы советовал не коверкать язык к неприспособленным конструкциям , а просто поменять язык.
Я-то уже поменял на C#. Но вот только дух C++ преследует и тут — в .Net-е оставили возможность вызвать перекрытый метод.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, minorlogic, Вы писали:
M>>>>Я считаю что это замечательно иметь такую возможность !
L>>>Ну приплыли. Дай угадаю твое следующее желание — получить доступ к приватным членам?
M>>Я могу тебя удивить , но и такая есть возможность в C++ .
L>Фрэнды не считаются. Если бы вызов перекрытых методов был только для фрэндов, необходимости в NVI не возникло бы.
А нет такой необходимостм....
M>>Вообще , я бы советовал не коверкать язык к неприспособленным конструкциям , а просто поменять язык.
L>Я-то уже поменял на C#. Но вот только дух C++ преследует и тут — в .Net-е оставили возможность вызвать перекрытый метод.
Видимо строители языков заблуждаются , жаль что получилось пролить на них свет познанья ...
Здравствуйте, minorlogic, Вы писали:
L>>Фрэнды не считаются. Если бы вызов перекрытых методов был только для фрэндов, необходимости в NVI не возникло бы.
M>А нет такой необходимостм....
Если бы не было необходимости, никому в голову не пришлось бы изобретать NVI.
M>>>Вообще , я бы советовал не коверкать язык к неприспособленным конструкциям , а просто поменять язык.
L>>Я-то уже поменял на C#. Но вот только дух C++ преследует и тут — в .Net-е оставили возможность вызвать перекрытый метод.
M>Видимо строители языков заблуждаются , жаль что получилось пролить на них свет познанья ...