Связанные с типом процедуры должны быть виртуальными
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 10.11.04 09:00
Оценка: -5
Для затравки: Как функции, не являющиеся методами, улучшают инкапсуляцию Скотт Мейерс (Scott Meyers) Перевод А. И. Легалова Статья опубликована в C/C++ user Journal (February, 2000) http://www.softcraft.ru/coding/sm/sm01.shtml


Скотт Мейерс предлагает следующий алгоритм:
if (f необходимо быть виртуальной)
   сделайте f функцией-членом C;
else if (f - это operator>> или operator<<)
{
   сделайте f функцией - не членом;
   if (f необходим доступ к непубличным членам C)
      сделайте f другом C;
}
else if (f необходимо преобразовывать тип его крайнего левого аргумента)
{
   сделайте f функцией - не членом;
   if (f необходимо иметь доступ к непубличным членам C)
      сделайте f другом C;
}
else if (f может быть реализована через доступный интерфейс класса)
   сделайте f функцией - не членом;
else
   сделайте f функцией-членом C;



Вопрос: а зачем так сложно? Давайте проще:
IF f необходимо быть виртуальной THEN сделайте f функцией членом ELSE сделайте f внешней функцией END


Все связанные с типом процедуры — виртуальны, а если нужны не виртуальные, а обычные, то для этого есть обычные процедуры не связываемые с типом.

1) X.f(); Вызов связанной с типом "виртуальной" процедуры f()
2) g(X); Вызов не связанной с типом обычной процедуры g()
3) третьего не дано, так как все остальное излишне

С аргументами:
  X.f(a, b, c);
  g(X, a, b, c);


Пример:
PROCEDURE MovePoint(VAR p: Point; dx, dy: INTEGER);
BEGIN
  p.SetX(p.GetX() + dx); (* Вызов виртуальных методов GetX/SetX *)
  p.SetY(p.GetY() + dy); (* Вызов виртуальных методов GetY/SetY *)
END;



Короче, если метод не виртуальный, то зачем он метод? Пусть он будет не методом, а внешней процедурой. А все оставшиеся методы — все поголовно виртуальны.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.