MROC3 - не магия,

а справедливое слияние очередей

Елена Шамаева,

Георгий Курячий

Иерархия классов с множественным наследованием

В каком порядке среди родительских классов искать поле v ?

[D, E, A, B, C] ?

[D, A, E, B, C] ?

...

MROC3. Индуктивный переход

Дано:

  • очередь предков класса D,
  • очередь предков класса E.

Необходимо:

  1. объединить очереди предков класса D и класса E,
  2. добавить в начало класс F.

Справедливое слияние очередей

  • Нельзя нарушать внутренний порядок  родительских очередей;

  • Класс-предок может быть в нескольких родительских очередях;

  • У очередей есть приоритет;

Справедливое слияние очередей

Справедливое слияние очередей

Справедливое слияние очередей

Справедливое слияние очередей

Справедливое слияние очередей

Ожидания программиста

0. однозначность

для иерархии классов - однозначный порядок просмотра родительских классов

1. дети раньше родителей

2. родители в порядке объявления при наследовании

class C(A, B):
[...,A,...,B,...]
class C(D):
[...,C,...,D,...]

Как выполнить "родители в порядке объявления при наследовании" ?

Добавим очередь из родительских классов!

class A: 
class B(A): 
class C(A, B): 

MROC3 выполняет все ожидания программиста

Справедливое слияние на графе наследования

  • На графе показана иерархия наследования;

  • Постепенно перемещаем классы из родительских очередей в итоговую;

  • На каждом этапе можно перемещать класс, стоящий внизу всех своих очередей;

  • Если таких классов несколько, выбирается класс из очереди с самым высоким приоритетом.

Справедливое слияние на графе наследования

class A:
class B(A):
class C(A):
class D(A):
class E(C, B):
class F(D, C):
class G(F, E):

Очередь класса F

(первый приоритет)

Очередь класса E

(второй приоритет)

Доп. очередь

(третий приоритет)

Справедливое слияние на графе наследования

Итоговая очередь:

[]

 

Добавляем F

Итоговая очередь:

[F]

 

Добавляем D

Справедливое слияние на графе наследования

Итоговая очередь:

[F, D]

 

Добавляем E

Итоговая очередь:

[F, D, E]

 

Добавляем C

Справедливое слияние на графе наследования

Итоговая очередь:

[F, D, E, C]

 

Добавляем B

Итоговая очередь:

[F, D, E, C, B]

 

Добавляем A

Спасибо за внимание!

Вопросы?