программистское
Dec. 14th, 2006 01:04 pmЧитал недавно интервью с Струструпом про C++. В какой-то момент его там спрашивают: ну а вы не жалеете обо всем этом, не был ли дизайн C++ ошибкой? Он отвечает: нет, не жалею, не был итд. А я себе представил другой ответ: да; я давно хотел это сказать: простите меня. Меня мучила совесть все эти годы, и теперь я прошу всех программистов на C++: простите меня, я хотел как лучше. И стреляется. Было бы эффектнее!
Я не понимаю, что такое mixins. Не на уровне ключевых слов, а реальное понимание, что это такое и чем отличается ну там от интерфейсов и других ООП-механизмов. Википедия не помогает, там невнятно. Если кто-то может мне объяснить, буду признателен.
no subject
Date: 2006-12-14 11:14 am (UTC)mixin Ordreded {
abstract int compareTo (Object o);
boolean equal (Object o) { return compareTo (o) == 0; }
}
no subject
Date: 2006-12-14 11:16 am (UTC)no subject
Date: 2006-12-14 11:17 am (UTC)2. В интерфейсе кода нет. А в микс-ине есть. Ну вот например представьте, что вы хотите добавить классу (и не одному!) метод ToString() (а раньше его не было). На каком-нибудь шарпе (до третьего) получается изрядный геморрой: пишется класс ToStringHelper, в котором реализуется всё, плюс интерфейс IToString, а затем от каждого класса делается наследование и пишутся одни и те же перенаправления из методов интерфейса в методы ToStringHelper. А то и вдобавок создание инкапсулированного объекта ToStringHelper со своим конструктором.
Если посмотреть внимательно, то это то же самое множественное наследование, только реализованное ручками.
no subject
Date: 2006-12-14 11:18 am (UTC)no subject
Date: 2006-12-14 11:22 am (UTC)no subject
Date: 2006-12-14 11:26 am (UTC)вобщем существенно более интересный язык получается когда объекты рассматриваются как _набор_ методов и data members.
как только происходит такой сдвиг в точке зрения -- тут-же появляются операции сложения интерфейсов, вычитания, пересечения. и появляется очень интересная идеология наследования. из public распространенных языков приблизительно такие возможности дает php.
насчет C++ -- я тоже надеюсь, чтоони когданить признаются что это была ошибка :)
no subject
Date: 2006-12-14 11:26 am (UTC)no subject
Date: 2006-12-14 11:37 am (UTC)Интерфейс-же - констукция не идеологическая, а именно реализационная - для честного множественного наследования хорошей сематники без криви никто так и не придумал (см радости С++)
no subject
Date: 2006-12-14 11:39 am (UTC)no subject
Date: 2006-12-14 11:42 am (UTC)Давайте более дотошно. Объект - набор методов и data members, отлично, я могу таким образом на объект посмотреть и в C++, и в Java (которые не заявляют, что поддерживают миксины). Что такое "сложение интерфейсов" - то же, что в C++ наследование от двух классов, а в Java реализация двух интерфейсов? А что такое вычитание или пересечение, на практике? И какая интересная идеология появляется?
no subject
Date: 2006-12-14 11:42 am (UTC)Тип объекта - просто список методов с их типами. Вместо наследования есть отношение тип/подтип над типами объектов - по наличию и совместимости методов.
Наследование есть, но это операция сугубо "реализационная" - позволяет не писать руками копию "предка" - она строго эквиватента просто реализации тех же методов "руками" и на приводимости никак не влияет.
Самое интересное - что язык статически типизированный и нет никакого аналога rtti.
no subject
Date: 2006-12-14 11:44 am (UTC)no subject
Date: 2006-12-14 11:46 am (UTC)При множественном наследовании с определением семантики для всего этого дела возникают проблемы - стандартная - класс является общим предком двух других, их потом скрещивают путем наследования. Что там делать с вызовом конструктора для общего предка etc. В С++ криви на этой почве изрядно и ничего особенно удобного так и не придумали.
А интерфейс и mixin - это просто куски vmt и все. У mixin'а просто некоторые поля уже заполнены.
no subject
Date: 2006-12-14 11:48 am (UTC)no subject
Date: 2006-12-14 11:48 am (UTC)По воводу C#: его корни как раз ведут в его университет.
no subject
Date: 2006-12-14 11:50 am (UTC)Давайте попробуем методически.
В C++ есть abstract base class. У него есть методы без кода, но могут быть и методы с кодом тоже. От него невозможно создать объект. Ему можно наследовать. Самостоятельной ценности он не имеет.
В Java есть abstract class. У него есть методы без кода, но могут быть и методы с кодом тоже. От него невозможно создать объект. От него можно наследовать, но не множественно. Самостоятельной ценности он не имеет.
В Java есть также интерфейс. У него есть только методы без кода. От него невозможно создать объект. От него можно наследовать, в том числе и множественно. Самостоятельной ценности он не имеет.
Если я правильно вас понял, вы говорите следующее: миксин является полным аналогом abstract base class в C++, и не является полным аналогом abstract class в Java, поскольку миксины можно смешивать в множественном наследовании, а абстрактные классы в Джаве нельзя. Таким образом (я продолжаю свою попытку пересказать ваше мнение), понятия миксина опирается на мнение, что попытка Джавы "укротить" множественное наследование C++ путем ограничения его только на интерфейсы была слишком жесткой, и следует ее "откатить", вернувшись к неограниченному множественному наследованию C++, но на практике применяя его только к абстрактным классам, и называть их миксинами.
Я правильно понял?
no subject
Date: 2006-12-14 11:56 am (UTC)объект мог убрать какие-то свои методы (вычитание), если в данный момент времени он не поддерживал эти операции. соответственно все оставшиеся обращающиеся к нему процессы могли заблокироваться до того момента, как эти методы появятся обратно. т.е. это был такой хитрый механизм синхронизации.
а пересечение множеств -- это приведение к какому-то интерфейсу. т.е. я хочу оставить в объекте только те классы, которые ответственны за выполнение конкретной задачи.
ндя ;) язык был экспериментальный конечно ;) с другой стороны -- функциональные языки дают все то-же самое, но с существенно более целостной и логически правильной форме.
no subject
Date: 2006-12-14 11:57 am (UTC)Я все-таки склоняюсь к тому, что OCaml придется выучить. для расширения кругозора.
no subject
Date: 2006-12-14 11:58 am (UTC)no subject
Date: 2006-12-14 12:00 pm (UTC)no subject
Date: 2006-12-14 12:02 pm (UTC)no subject
Date: 2006-12-14 12:12 pm (UTC)Пусть жираф был неправ, но виновен не жираф
Date: 2006-12-14 12:22 pm (UTC)no subject
Date: 2006-12-14 12:27 pm (UTC)no subject
Date: 2006-12-14 12:35 pm (UTC):-)