2013-05-30 5 views
0

Недавно я нашел загадочную (для меня) проблему: допустим, у меня есть иерархия классов 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: Удалены упрощающее предположение, что позволило бы простое решение не применимо к более общей проблеме]

ответ

2

раствора, так как вы предполагаете, единичное наследование, и прямые отношения подклассов, чтобы просто создать D (1) в качестве подкласса C (n), и в этом случае все Ds также будут в каждом классе C.

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

+0

+1 для быстрого ответа и простого решения. К сожалению, это просто, потому что я упрощен, не думая, что это приведет к новым решениям. –

+0

@AnsgarEsztermann Не совсем. Я не думаю, что эта проблема действительно существует, и я призываю вас показать иерархию, где она возникает. – Marcin

Смежные вопросы