MROC3 - не магия,

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

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

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

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

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

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

[F, 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

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

Вопросы?

MROC3

By derinhelm