Я пишу объектно-ориентированную оболочку API окна для Windows в D, и у меня возникла проблема (не зависящая от языка).
Windows требует, чтобы все окна были предварительно зарегистрированы вRegisterClass
;расширение существующего класса требует замены оконной процедуры.Кроме того, кажется, что есть два вида оконных дескрипторов: HWND
s, которые должны быть удалены (через DestroyWindow
), и HWND
s, которые не (например, из других приложений).
Я создал класс Window
, и пока я просто обертываю ShowWindow
, UpdateWindow
, FindWindow
и другие подобные методы, все хорошо и здорово.Но как только я пытаюсь добавить конструктор с параметром className
в мой класс, который вызывает CreateWindow
, я сталкиваюсь с проблемой:
- Указанный
className
должен быть уже зарегистрированна RegisterClass
. - Чтобы зарегистрировать новый класс окна, мне нужно было бы сделать мои подклассы из
Window
так или иначе вызвать RegisterClass
, прежде чем пытаться создать новое окно, прямо или косвенно. - Для того, чтобы мой дизайн (и наследование) имел смысл, мне нужно убедиться, что для любого данного подкласса
Window
все экземпляры фактически являются экземплярами одного и того же класса окна;а именно, что все className
из определенного подкласса идентичны.(Это потому, что оконные процедуры для всех экземпляров определенного оконного класса должны быть одинаковыми.)
Проблема в том, что нет способа иметь метод abstract static
(для Windowчтобы иметь возможность запрашивать у подклассов информацию об их классе и регистрировать их один раз), и поэтому я вынужден сказать что-то вроде CreateWindow(this.className, ...)
, чтобы создать новое окно, которое легко становится проблематичным, если мои подклассы не уважаютЭто правило и дает мне другое имя класса для каждого экземпляра окна.
Кроме того, мне нужно однозначное сопоставление между полем WNDCLASS.lpfnWndProc
и методом моего подкласса Window (переопределенным) WndProc
.,Однако это не совсем работает, если я вынужден получать указатель на метод для каждого экземпляра, поскольку он нарушает весь дизайн ООП и портит все.
Хотя я могу применять эту согласованность во время выполнения, она немного уродлива и поэтому не является хорошим решением.
Итак, если вкратце, у кого-нибудь есть идеи элегантного решения дляпроблема создания abstract static
метода?Я думаю о некоторых шаблонах дизайна, таких как Фабрика и все такое, но я не уверен, подходят ли они здесь ... если кто-то думает, что они могли бы, я был бы очень признателен за небольшое объяснение того, как это вписалось бы в дизайн.
Спасибо!