Недавно я нашел загадочную (для меня) проблему: допустим, у меня есть иерархия классов C ... C_ n. Предположим, что хотя бы некоторые классы имеют более одного (прямого) дочернего класса, но ни один из них не имеет более одного родителя (т. Е. Нет множественного наследования). Я хотел бы изменить поведение иерархии. Моим первым импульсом было бы создание подклассов D ... D n и при необходимости переопределить методы, но есть одна проблема: при вызове вновь переопределенного метода может потребоваться передать фактический D i как формальный D (или некоторый уровень между ними); это можно решить путем подкласса C1 -> D1 -> D2 ...
. Но при вызове методы без изменений, какой-либо фактический D я должен быть передан в качестве официального С я, поэтому мы должен получить каждый D я непосредственно из Ci. Есть ли элегантный или общепринятый способ решить эту загадку? Если да, есть ли способ, не прибегая к множественному наследованию?Расширение иерархии классов
Если общий способ достижения этого не существует, может ли автор оригинальной иерархии C следовать определенным правилам, чтобы обеспечить эту возможность?
Для тех, кто предпочитает более практичный подход, исходная иерархия реализует SOAP в Аде. Я работаю над XML-RPC. С абстрактной точки зрения SOAP является надмножеством XML-RPC, но фактический XML «на проводе» совершенно другой. В принципе, большую часть работы можно выполнить, выбрасывая некоторые типы данных (например, XML-RPC имеет одно целое число и один тип с плавающей точкой, тогда как SOAP имеет несколько) и заменяет подпрограммы, которые преобразуют остальные типы в и из XML. Однако из-за вышеупомянутых проблем наследования я закончил копирование почти всей иерархии SOAP. Единственный код, который я смог повторно использовать правильно, оказался частью HTTP (поскольку он не касается только текстовых полезных нагрузок, а не объектов SOAP).
[Edit: Удалены упрощающее предположение, что позволило бы простое решение не применимо к более общей проблеме]
+1 для быстрого ответа и простого решения. К сожалению, это просто, потому что я упрощен, не думая, что это приведет к новым решениям. –
@AnsgarEsztermann Не совсем. Я не думаю, что эта проблема действительно существует, и я призываю вас показать иерархию, где она возникает. – Marcin