Обмануть единичное наследование в Java?

Сохранение и загрузка в разных версиях pandas с использованием pickle часто не работает. Вместо этого используйте pandas.HDFStore .

Когда мне нужно было обновить панды, но также потребовались некоторые данные, сохраненные с помощью pickle в предыдущих версиях, я вернулся и снова сохранил эти данные в формате HDF, когда ничего не получилось. Нет проблем.

Работает для любой структуры данных pandas, кажется, даже мультииндексированных dataframes! Короче говоря, если травление заканчивается после обновления версии, попробуйте HDFStore; он более надежный (и более эффективный!).

8
задан 11 revs, 2 users 100% 13 May 2012 в 02:48
поделиться

12 ответов

Уверенный Вы можете, но это хитро, и необходимо действительно рассмотреть, является ли это путем, которым Вы хотите пойти.
Идея состоит в том, чтобы использовать основанное на объеме наследование вместе с основанным на типе. Который является разговором типа для того, чтобы сказать, что во внутренних целях, внутренние классы "наследовали" методы и поля внешнего класса. Это немного похоже на mixins, где внешний класс смешан - в к внутреннему классу, но не столь безопасный, как можно изменить состояние внешнего класса, а также использовать его методы.
Gilad Bracha (один из основных разработчиков языка Java) написал работу, обсудив это. Так, предположите, что Вы хотите совместно использовать некоторые методы для внутреннего пользования между некоторыми несвязанными классами (например, для обработки строк), можно создать sub классы их как внутренние классы класса, который имеет все необходимые методы, и sub классы могли использовать методы и от их суперклассов и от внешнего класса.

Так или иначе это коварно для сложных классов, и Вы могли получить большую часть функциональности с помощью статического импорта (от java 5 на). Большой вопрос для собеседований и тестов паба, хотя ;-)

20
ответ дан 5 December 2019 в 05:00
поделиться

Наследование SingleMultiple не поддерживается Java, вместо этого это имеет интерфейсы для служения той же цели. В случае, если Вы непреклонны при использовании множественного наследования, оно должно быть сделано в C++.

5
ответ дан 5 December 2019 в 05:00
поделиться

Использование состава вместо наследования имеет тенденцию быть путем вокруг этого. Это на самом деле также помогает много с тестируемостью, таким образом, это - хорошая практика в целом.

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

4
ответ дан 5 December 2019 в 05:00
поделиться

Я полагаю, что фундаментальная причина, что Java не поддерживает множественное наследование, совпадает с C#; все объекты в конечном счете получены из Объекта, и он имеет разнообразные пути к тому же базовому классу, неоднозначно для компилятора. Неоднозначный == Плохо, таким образом, компилятор не позволяет его.

Вместо этого можно моделировать множественное наследование через делегацию. См. эту статью для примера.

3
ответ дан 5 December 2019 в 05:00
поделиться

Можно обмануть его немного (и я подчеркиваю немного) при помощи java.lang.reflect. Экземпляры прокси.

Это действительно просто позволяет Вам добавлять дополнительные интерфейсы и делегировать их вызовы к другому экземпляру во времени выполнения.

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

2
ответ дан 5 December 2019 в 05:00
поделиться

Было усилие принести mixins в Java. Проверьте эту ссылку: http://www.disi.unige.it/person/LagorioG/jam/

0
ответ дан 5 December 2019 в 05:00
поделиться

Необходимо стараться отличить интерфейсное наследование (по существу наследование контракта для предоставления конкретных услуг) от наследования реализации (наследование механизмов реализации).

Java обеспечивает интерфейсное наследование механизмом реализаций, и Вы можете иметь, несколько соединяют интерфейсом с наследованием.

Наследование реализации, расширяет механизм, и Вы только получили единственную версию этого. Вам действительно нужны несколько наследование реализации? Я держал пари, что Вы не делаете, это переполнено неприятными последствиями, если Вы не программист Eiffel так или иначе.

1
ответ дан 5 December 2019 в 05:00
поделиться

Использовать interfaces. Можно реализовать столько, сколько Вы хотели бы. Можно обычно использовать некоторый вариант на Составном Шаблоне (GoF), чтобы смочь снова использовать код реализации, если это желательно.

1
ответ дан 5 December 2019 в 05:00
поделиться

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

1
ответ дан 5 December 2019 в 05:00
поделиться

Я думал об этом немного больше и понял что, в то время как динамические прокси будут работать (это - как RMI (использовал?) для работы) если бы Вы действительно хотите этот вид функциональности, Вы были бы более обеспеченным рассмотрением аспектно-ориентированного программирования (AOP) с помощью чего-то как AspectJ (eclipse.org/aspectj).

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

Как все остальные указали, желание/нуждание множественного наследования обычно указывает, что Вы не приближаетесь к проблеме с правильной точки зрения. Помните, что принцип GoF "предпочитает состав по наследованию" для запуска!

0
ответ дан 5 December 2019 в 05:00
поделиться

JAVA не поддерживает несколько Inheritence.

Можно заставить это реализовывать несколько интерфейсов, и некоторые рассматривают это как окольный путь проблема. Лично я должен все же использовать несколько наследование, таким образом, я не могу действительно понять его обращение.

Обычно, когда кто-то предлагает несколько наследование в c# или JAVA вследствие того, что 'они могли' в C++. Я - поклонник 'просто, потому что Вы можете doens't означать, что Вы должны'. Как c# и JAVA не поддерживает его, почему пытаются вынудить это сделать что-то, что это не было разработано, чтобы сделать. Нельзя сказать, что существуют уникальные случаи, где это - допустимая техника для использования, просто код может обычно быть пересмотрен для не необходимости в нем.

0
ответ дан 5 December 2019 в 05:00
поделиться

Используя внутренние классы, C ++ иногда предпочитает именно это: Внутренний Идиома класса .

0
ответ дан 5 December 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: