A2 & Oberon » Программирование » ActiveOberon » Абстрактные методы

Страниц (2): [1] 2 »
 

1. MaDzi - 08 Января, 2009 - 20:51:32 - перейти к сообщению
Чем дальше я копаюсь с Bluebottle (GUI для A2), тем больше мне не оно не нравится и появляется устойчивое желание её переписать. Куча кода просто не дописаны.

(все процедуры с описанием "A:" или "A*)" в wiki являются пустыми)
2. BohdanT - 08 Января, 2009 - 23:35:36 - перейти к сообщению
MaDzi пишет:
(все процедуры с описанием "A:" или "A*)" в wiki являются пустыми)

непонял? Не понял
3. MaDzi - 09 Января, 2009 - 00:08:08 - перейти к сообщению
BohdanT пишет:
MaDzi пишет:
(все процедуры с описанием "A:" или "A*)" в wiki являются пустыми)

непонял? Не понял


См. http://trac.assembla.com/oberonr...OBJWindowManager все методы где в комментах встретишь (** ... A*) являются абстрактными (т.е. не реализованными) там их прилично набегает, а это между прочим, WindowManager.
4. BohdanT - 09 Января, 2009 - 00:37:36 - перейти к сообщению
Вобщето это тема по шрифтам Подмигивание ну да ладно может потом выделим в отдельную...
MaDzi пишет:
абстрактными (т.е. не реализованными)

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

Window - это каркас окна. С заложенными механизмами. Я не силен в теорети, строитель я Подмигивание (вот Владимир может лучше меня опишет, а в вики инфы я не нашел)
Вобщем опишу как это в моем понимании, т.е. своими словами...

Мы делаем каркас окна, закладываем определенные механизмы, и делаем заглушки(абстрактные методы) к этим механизмам.

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

Многие механизмы из приведенного модуля
WMWindowManager; (** AUTHOR "TF"; PURPOSE "Generic window manager"; *)
описываются в
WindowManager; (** AUTHOR "TF"; PURPOSE "Window manager implementation"; *)
Заметь разницу Generic и implementation Подмигивание
5. lit-uriy - 09 Января, 2009 - 01:53:02 - перейти к сообщению
Я еще не разбирался толком с Активным Обероном. Но во многих языках с ООП, есть понятие абстрактного класса/объекта.
BohdanT пишет:
делаем заглушки(абстрактные методы) к этим механизмам
Делаем интерфейс, а не заглушки, для будущих наследников, чтобы все работали по одним правилам.

BohdanT пишет:
Т.е. мы не сможем забыть что-те реализовать. При работе задействованного механизма произойдет трап на вызове абстрактного метода.
такого понятия в ООП нету, есть виртуальный метод. Который в наследнике надо реализовать. В С++ это понятие имеет два варианта:
1) Виртуальный, тот который может понадобится реализовать, но необязательно, т.к. в базовом (не абстрактном) классе уже реализован.
2) Истинно виртуальный, тот который обязательно должен быть реализован, т.к. неимеет реализации в базовом (уже абстрактном, т.к. имеется хотябы один истинно виртуальный метод) классе.

Трапа помоему мнению произойти недолжно, Компилятор должен матерится на отсутствие реализации.
6. BohdanT - 09 Января, 2009 - 02:49:41 - перейти к сообщению
lit-uriy пишет:
Делаем интерфейс, а не заглушки,

согласен, не нашел подходящих слов Подмигивание
lit-uriy пишет:
Трапа помоему мнению произойти недолжно,

произойдет, на сколько я помню
(Добавление)
lit-uriy пишет:
такого понятия в ООП нету, есть виртуальный метод.

Может в С++ нет? В ООП есть. В C# например.

Абстрактный класс в объектно-ориентированном программировании — класс, содержащий хотя бы один абстрактный метод. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его неабстрактных потомков.

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

Абстрактные методы часто являются и виртуальными, в связи с чем понятия «абстрактный» и «виртуальный» иногда путают.
7. lit-uriy - 09 Января, 2009 - 03:10:02 - перейти к сообщению
BohdanT пишет:
В C# например.
в мелкософте все ни как у людей.
(Добавление)
BohdanT пишет:
Абстрактные методы часто являются и виртуальными, в связи с чем понятия «абстрактный» и «виртуальный» иногда путают.
только я не понял чем отличаются обстрактные методы от виртуальных?


П.С. частьпоследних постов лучше в Курилку переместить, а то за офтопили.
8. MaDzi - 09 Января, 2009 - 16:31:34 - перейти к сообщению
Сообщение целиком не проходит поэтому буду бить на части
(* Часть 1 *)
Во-первых, оригинальная проблема в том, что часть методов не реализована и это класс WindowManager, а не Window. Я согласен что класс Window должен перегружаться, поэтому может содержать пустые методы. Но часто ли перегружается WindowManager ? Хоть один пример?

Во-вторых, абстрактные методы обычно обозначаются как Abstract, хотя бы в комментариях.

В-третьих, виртуальные методы - методы, которые перегружают существующие методы за счёт использования динамической таблицы виртуальных методов. Основное отличие виртуальных методов от других - возможность вызова метода предка.
(Добавление)
(* Часть 2 *)
Собственно суть проблемы:

WindowManager* = OBJECT(Plugins.Plugin)

(* ...skip... *)

(** Window management *)
(** Add adds a window at pos l, t with flags *)
PROCEDURE Add*(l, t : LONGINT; item : Window; flags:SET);
END Add;

(** Remove removes a window *)
PROCEDURE Remove*(item : Window);
END Remove;

(** Set the position of a window *)
PROCEDURE SetWindowPos*(vs : Window; x, y : LONGINT);
END SetWindowPos;

(** Set the size of a window. Return the new size in width and height *)
(** If the window contains left, top, right or bottom, SetWindowSize is called
appropriately *)
PROCEDURE SetWindowSize*(vs : Window; VAR width, height : LONGINT);
END SetWindowSize;

(** Add a region to be refreshed *)
PROCEDURE AddDirty*(VAR rect:Rectangle);
END AddDirty;

(** Add a dirty region. The region is in window coordinates and will be clipped against non transparent
windows above *)
PROCEDURE AddVisibleDirty*(w : Window; rect : Rectangle);
END AddVisibleDirty;

(** Set the keyboard focus to the window w *)
PROCEDURE SetFocus*(w : Window);
END SetFocus;

(** Move Window w to front. If FlagStayOnTop is not set in w.flags, w will stay behind all windows with this flag set *)
PROCEDURE ToFront*(w : Window);
END ToFront;

(** Move Window w to the background. If FlagStayOnTop is not set in w.flags, w will stay behind all windows *)
PROCEDURE ToBack*(w : Window);
END ToBack;
9. BohdanT - 09 Января, 2009 - 16:44:42 - перейти к сообщению
я привел Улыбка тут наверное путаница из-за похожих имен
BohdanT пишет:
WMWindowManager; (** AUTHOR "TF"; PURPOSE "Generic window manager"; *)
описываются в
WindowManager; (** AUTHOR "TF"; PURPOSE "Window manager implementation"; *)
10. MaDzi - 09 Января, 2009 - 16:47:01 - перейти к сообщению

(** Return the window at postition x, y in global space. *)
(** Windows that have the FlagNavigate flag set will not be considered *)
(** Must hold WM lock *)
PROCEDURE GetPositionOwner*(x, y : LONGINT) : Window;
END GetPositionOwner;

PROCEDURE GetFocusOwner*() : Window;
END GetFocusOwner;

PROCEDURE StartDrag*(w : Window; sender, data : ANY; img : Graphics.Image; onAccept, onReject : Messages.CompCommand) : BOOLEAN;
END StartDrag;

(** a pointer button must be pressed *)
PROCEDURE TransferPointer*( to : Window) : BOOLEAN;
END TransferPointer;

(** Adjust pointer to new position / check picture *)
PROCEDURE CheckPointerImage*;
END CheckPointerImage;

(** View management *)
(** Add a view *)
PROCEDURE AddView*(v : ViewPort);
END AddView;

(** Add the whole View.range as dirty and cause a redraw *)
PROCEDURE RefreshView*(v : ViewPort);
END RefreshView;

(** RemoveView from windowmanager *)
PROCEDURE RemoveView*(v : ViewPort);
END RemoveView;

(** Messages *)
PROCEDURE Broadcast*(VAR m : Message);
END Broadcast;

(** Enumeration *)
(** Get the first "user" window --> May return NIL if only background and pointer window are installed *)
(** Must hold lock *)
PROCEDURE GetFirst*() : Window;
END GetFirst;

(** Get the window next "user" window on top of x *)
PROCEDURE GetNext*(x : Window) : Window;
END GetNext;

(** Get the "user" window below x *)
PROCEDURE GetPrev*(x : Window) : Window;
END GetPrev;

(** Replace the background window with w. Return the current background window *)
PROCEDURE ReplaceBackground*(w : Window) : Window;
END ReplaceBackground;

(** Return the area that is actually occupied *)
PROCEDURE GetPopulatedArea*(VAR r : Rectangle);
END GetPopulatedArea;
END WindowManager;

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0146]     [ Gzipped ]