Корректная реализация виртуальных функций в PHP?

Я не уверен, это корректный, но я использую что-то вроде этого:

  • флажок:
def check_item_activated_callback (menuitem, a, b):
    if menuitem.property_get_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE) == Dbusmenu.MENUITEM_TOGGLE_STATE_CHECKED:
       menuitem.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_UNCHECKED)
    else:
       menuitem.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_CHECKED)

check1 = Dbusmenu.Menuitem.new ()
check1.property_set (Dbusmenu.MENUITEM_PROP_LABEL, "Checkbox")
check1.property_set (Dbusmenu.MENUITEM_PROP_TOGGLE_TYPE, Dbusmenu.MENUITEM_TOGGLE_CHECK)
check1.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_CHECKED)
check1.property_set_bool (Dbusmenu.MENUITEM_PROP_VISIBLE, True)
check1.connect (Dbusmenu.MENUITEM_SIGNAL_ITEM_ACTIVATED, check_item_activated_callback, None)
qucklist.child_append (check1)
  • переключатели:
def radio_item_activated_callback (radioitem1, a, radioitem2):
    radioitem1.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_CHECKED)
    radioitem2.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_UNCHECKED)

radio1 = Dbusmenu.Menuitem.new ()
radio1.property_set (Dbusmenu.MENUITEM_PROP_LABEL, "Radio Button 1")
radio1.property_set (Dbusmenu.MENUITEM_PROP_TOGGLE_TYPE, Dbusmenu.MENUITEM_TOGGLE_RADIO)
radio1.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_UNCHECKED)
radio1.property_set_bool (Dbusmenu.MENUITEM_PROP_VISIBLE, True)
quicklist.child_append (radio1)

radio2 = Dbusmenu.Menuitem.new()
radio2.property_set (Dbusmenu.MENUITEM_PROP_LABEL, "Radio Button 2")
radio2.property_set (Dbusmenu.MENUITEM_PROP_TOGGLE_TYPE, Dbusmenu.MENUITEM_TOGGLE_RADIO)
radio2.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_CHECKED)
radio2.property_set_bool (Dbusmenu.MENUITEM_PROP_VISIBLE, True)
quicklist.child_append (radio2)

radio1.connect (Dbusmenu.MENUITEM_SIGNAL_ITEM_ACTIVATED, radio_item_activated_callback, radio2)
radio2.connect (Dbusmenu.MENUITEM_SIGNAL_ITEM_ACTIVATED, radio_item_activated_callback, radio1)
  • разделитель (иначе "горизонтальные делители"):
separator = Dbusmenu.Menuitem.new ();
separator.property_set (Dbusmenu.MENUITEM_PROP_TYPE, Dbusmenu.CLIENT_TYPES_SEPARATOR)
separator.property_set_bool (Dbusmenu.MENUITEM_PROP_VISIBLE, True)
quicklist.child_append (separator)
  • позволил/отключил пункты меню:
item1 = Dbusmenu.Menuitem.new ()
item1.property_set (Dbusmenu.MENUITEM_PROP_LABEL, "Item Enabled")
item1.property_set_bool (Dbusmenu.MENUITEM_PROP_VISIBLE, True)
item1.property_set_bool (Dbusmenu.MENUITEM_PROP_ENABLED, True)
quicklist.child_append (item1)

item2 = Dbusmenu.Menuitem.new ()
item2.property_set (Dbusmenu.MENUITEM_PROP_LABEL, "Item Disabled")
item2.property_set_bool (Dbusmenu.MENUITEM_PROP_VISIBLE, True)
item2.property_set_bool (Dbusmenu.MENUITEM_PROP_ENABLED, False)
quicklist.child_append (item2)
22
задан graham.reeds 9 October 2011 в 23:01
поделиться

3 ответа

В PHP все общедоступные и защищенные функции являются «виртуальными». Вы можете предотвратить переопределение функций, добавив ключевое слово final . (Или сделав их закрытыми, но это, вероятно, плохая идея.)

При разработке базового класса я подумал бы о поведении, на которое подклассы хотели бы повлиять. Я бы, например, создал пустые функции, такие как before_update () и after_insert ().

function after_insert() {
  // Virtual
}

Которые базовый класс будет вызывать при возникновении события обновления / вставки.

Может быть, функция is_valid (), которая всегда возвращает true в базовом классе, и используйте блок комментариев, чтобы описать последствия, когда подкласс возвращает false.

Надеюсь, это послужит вам источником вдохновения.

33
ответ дан 29 November 2019 в 04:57
поделиться

Используйте "background-image" сложно дать конкретную информацию. Но на ум приходит несколько вещей:

  1. Абстракция базы данных - это сложный процесс. Я понимаю, что вы хотите, чтобы он был стройным, чистым и подлым, но я думаю, что это чертовски сложно. Вам действительно нужно внимательно изучить спецификации различных движков БД, чтобы увидеть, какие части являются общими, а какие требуют специализации. Также; Вы уверены, что абстракция БД не смешана с шаблоном шлюза табличных данных, поскольку вы говорите о добавлении таблиц БД путем расширения базового класса?

  2. Методы вашего текущего базового класса могут делать слишком много и / или не являются достаточно общими для начала, если расширенные классы изгибаются назад, чтобы поддерживать их в чистоте. Может быть, вам следует разбить методы интерфейса базового класса на более мелкие защищенные методы, которые являются достаточно общими, чтобы их можно было повторно использовать в методах переопределения расширенных классов? Или наоборот: возможно, вам следует иметь перехватчики для переопределяемых методов в ваших интерфейсных методах.

  3. Следуя пункту 2: Что не так с абстрактным классом с некоторыми общими реализованными методами, и пусть ваш ванильный класс (ваш базовый класс) и другие классы наследуют от , что ?

  4. И, наконец, может быть, вам следует просто принудительно реализовать интерфейс вместо расширения базового класса?

0
ответ дан 29 November 2019 в 04:57
поделиться

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

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

4
ответ дан 29 November 2019 в 04:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: