Как проблема с бриллиантами в oops решается с помощью «общей» стратегии? - PullRequest
0 голосов
/ 13 ноября 2018

Проблема с бриллиантом решается в некоторых языках OOPS (например, curl), имея многократно унаследованный класс как «общий»?Я хочу знать, как это работает.Кроме того, я хочу знать роль первичных и вторичных конструкторов в решении проблемы алмазов на этих языках OOPS при использовании общей стратегии.Предположим, есть 4 класса, скажем, A, B, C и D. Пусть структура наследования B, а C наследует A, а D наследует и B, и C. Каждый класс имеет переменную, скажем, A имеет a, B имеет b, C имеет c иD имеет d.Как происходит создание объекта для каждого класса?

1 Ответ

0 голосов
/ 19 ноября 2018

Ссылаясь на Википедию в https://en.wikipedia.org/wiki/Multiple_inheritance в пуле Curl:

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

Отсюда, без знания Curl и толькос приведенной выше цитатой и this , где указано, что

Семантика объекта Curl аналогична семантике Java и C ++.

Учитывая

    A
   /  \
 B(A) C(A)
   \   /
   D(B,C)

Я представляю (точно не знаю), что кодер отвечает за устранение неоднозначности проблемы путем указания квалифицированного имени конструктора для запуска при вызове родительского конструктора из D (B, C) подкласс.

Похоже, что A должен быть объявлен shared, и когда D создается, B запускает конструктор, который вызывает конструктор A (основной), C запускает конструктор, который вызывает A (вторичный) конструктор.Различие между первичным / вторичным вызовом конструктора является автоматическим и прозрачным для кодировщика.

При вызове двух конструкторов A в памяти создаются два объекта A, то есть класс A используется совместно с двумя разными подклассами, нонет ни одного «общего» объекта A, а двух независимых (см. также виртуальное / не виртуальное наследование , которое как-то связано (C ++).)

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

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