LINUX.ORG.RU

Ответ на: комментарий от jtootf

так ясно.

Но ведь это отличается от канонического^W популярного понимания того, что такое ООП, мне казалось что в треде вопрос об этом был..

qnikst ★★★★★
()
Ответ на: комментарий от hateyoufeel

приведите пример какого-либо языка, для которого невыполнимо указанное условие и при этом он является ООП, или, наоборот, неООП язык, в котором выполнимо указанное условие

subtyping к ООП имеет довольно посредственное отношение.

а это просто враньё

anonymous
()
Ответ на: комментарий от Freyr69

Ты не можешь держать в руке описание, ты можешь держать в руке листок бумаги или что-то подобное

Да, каждый конкретный класс/тип и является «чем-то подобным», т.е конкретным описанием, запечатленным на материальном носителе. Если ты говоришь о платоновской идее типа, то у меня для тебя плохие новости - идей не существует, наш мир материален.

средневековый тип мышления, кстати

Средневековый тип мышления - это как раз у тебя, с твоей «идеей» бога типа, которую нельзя потрогать.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от Freyr69

Не знаю, как в некоторых языках, но здравый смысл говорит, что тип и объект типа — не одно и то же.

Речь не идет о «тип объекта == объект типа» Ты путаешь средства реализации типа, и само семантическое понятие типа. Как классы так и объекты являются средствами реализации других объектов, и в этом смысле они не отличаются (в некоторых ЯП). Там где есть отличие — это ненужное усложнение.

Твоя проблема в том, что ты путаешь средства реализации с абстракцией. Любой экземпляр принадлежит какому то типу. Однако, с логической точки зрения, например, 2 автомобиля имеют тот же самый тип даже в том случае, если они порождены разными классами (разными экземплярами классов). Данное понятие в данном контаксте вообще не рассматривается. Тип/класс в языке — это средства реализации, а не декларативное описание.

somequest
()
Ответ на: комментарий от jtootf

не уточнялось понимание ООП; более того

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

somequest
()
Ответ на: комментарий от anonymous

неООП язык, в котором выполнимо указанное условие

Любой язык с зависимыми типами. Ну или на крайняк Haskell + Liquid Haskell.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Любой язык с зависимыми типами

можно развернуть мысль? что такое дочерний тип в контексте зависимых типов?

jtootf ★★★★★
()
Ответ на: комментарий от hateyoufeel

Подмножество значений супертипа.

несмотря на то, что я встречаю термины subtype/supertype в некоторых документах по Agda и Coq, формального определения я не вижу, и оно мне неочевидно с точки зрения теории

потому попрошу уточнить, лучше - с примером. что такое супертип?

jtootf ★★★★★
()
Ответ на: комментарий от Pinkbyte

В общелисповом ООП методы определяются отдельно от классов и не привязаны к обектам.

loz ★★★★★
()
Ответ на: комментарий от jtootf

попрошу уточнить, лучше - с примером. что такое супертип

Пример на пальцах: супертип — множество целых чисел. Подтипы «множество целых чисел от 1 до 20», «множество целых чисел от 5 до 40». Подтипы, очевидно, не являются классами, так как множества объектов разных классов, не являющихся (пра*)родителями по отношению друг к другу не могут пересекаться.

monk ★★★★★
()
Ответ на: комментарий от jtootf

термины subtype/supertype

В Common Lisp хорошо показано. Есть subtypep для определение отношения subtype/supertype и есть отдельно typep и отдельно class-of. Заметь, что type-of быть не может, так как каждое значение принадлежит бесконечному множеству типов.

monk ★★★★★
()
Ответ на: комментарий от monk

я хотел с примером на ЯП с зависимыми типами. мне не очевидно, как эти вещи связаны

Подтипы, очевидно, не являются классами

а вот этого я не понял

jtootf ★★★★★
()

Полиморфизм (времени выполнения) это сердце ООП. В этой связи, как ни странно, квинтэссенция ООП это мультиметоды, которых толком нигде нет.

Legioner ★★★★★
()
Ответ на: комментарий от jtootf

Подтипы, очевидно, не являются классами

а вот этого я не понял

Классы обязаны составлять иерархию. У каждого объекта может быть только один непосредственный класс. Объект считается принадлежащим классу и предкам этого класса. Поэтому для каждого объекта можно получить непосредственный класс этого объекта.

Тип — это просто произвольное множество объектов (+ операции над этими объектами). Каждый объект принадлежит типу-синглтону (типу из одного объекта и возможных операций на нём) а также бесконечному количеству других типов. Для подтипов характерна невозможность выстроить однозначную иерархию: что ближе для числа 5 — «положительные целые числа» или «нечётные целые числа»?

я хотел с примером на ЯП с зависимыми типами

Agda:

data IsEven : Nat → Set where
   evenZ  : IsEven zero
   evenSS : (n : Nat) → IsEven n → IsEven (suc (suc n))

data UpTo10 : Nat → Set where
   UpTo10S : (n : Nat) → (n < 10) → UpTo10 n

Можно сделать

f : IsEven → IsEven
f n = n + 2

g : UpTo10 → Nat
g n = n + 2

И будет работать как f 6, так и g 6. Заметим также, что + имеет тип Nat → Nat → Nat. А подставлять в него мы можем как IsEven (в функции f), так и UpTo10 (в функции g). Но мы не можем сделать функцию, которая для значений типа IsEven возвращала бы один результат, а для значения типа UpTo10 — другой, так как множества значений этих типов пересекаются и между ними нет отношения предок-потомок.

monk ★★★★★
()
Ответ на: комментарий от Legioner

квинтэссенция ООП это мультиметоды, которых толком нигде нет.

Можно сделать мультиметоды без классов, достаточно иерархии на подтипах:

(require gls)

(define (fact x)
  (defgeneric fact0
    (method ((n (and? integer? (== 1))) (acc integer?))
            acc)
    (method ((n integer?) (acc integer?))
            (fact0 (- n 1) (* acc n))))
  (fact0 x 1))

(and? a b) является потомком для a и b, а (or? a b) является предком для a и b.

monk ★★★★★
()
Ответ на: комментарий от monk

так как множества объектов разных классов, не являющихся (пра*)родителями по отношению друг к другу не могут пересекаться.

Во первых, никто не мешает им быть прародителями друг друга, в смысле наследования друг от друга. Во вторых, почему это они не могут пересекаться? Возьмем пример. Сын унаследовал у папы множество конечностей (2 руки и 2 ноги) но не унаследовал ум. и так, имеем 2 множества {левая рука, правая рука, левая нога, правая нога, мозги} и {левая рука, правая рука, левая нога, правая нога}. По твоему, эти множества не пересекаются?

somequest
()
Ответ на: комментарий от Legioner

Полиморфизм (времени выполнения) это сердце ООП. В этой связи, как ни странно, квинтэссенция ООП это мультиметоды

Хотелось бы услышать обоснование того, почему это *в этой связи* квинтессенция ООП — это мультиметоды? И более того, какое они вообще имеют к этому отношение?

somequest
()
Ответ на: комментарий от monk

У каждого объекта может быть только один непосредственный класс

С чего это?

что ближе для числа 5 — «положительные целые числа» или «нечётные целые числа»?

Зависит от точки зрения/восприятия

Тип — это просто произвольное множество объектов

не произвольное, а сгрупированное по каким либо критериям. И тут опять не совсем понятно, есть тип/класс с точки зрения абстракции, а есть с точки зрения реализации, это разные вещи. Одно дело, когда мы декларируем/реализуем тип, другое — когда проверяем соответствие предикату.

somequest
()
Ответ на: комментарий от monk

(and? a b) является потомком для a и b, а (or? a b) является предком для a и b.

Первый раз слышу такое. Ты выстраиваешь в эту иерархию сами выражения что-ли?

На самом деле адекватный взгляд, с точки зрения ООП — and и or являются экземплярами Method или Function, а a и b — произвольные выражения, возвращающие объекты типа Boolean.

somequest
()
Ответ на: комментарий от jtootf

было подтверждение того, что это не только моя позиция

там написано

OO is only about message passing and isolation and protection of state.

А ты несешь какую то чушь про теорию категорий. ты английскую мову умеешь читать? Может тебе перевести, что там написано? Или может подтверждением твоей позиции является также гладиолус и ряд других вещей? Тогда вопросов нет.

anonymous
()
Ответ на: комментарий от somequest

Потому что полиморфизм это частный случай мультиметодов для одного объекта. Полиморфизм для двух объектов, например, позволяет выразить популярный ООП-паттерн «визитор» в виде естественной синтаксической конструкции.

Legioner ★★★★★
()
Ответ на: комментарий от somequest

Во первых, никто не мешает им быть прародителями друг друга ...

Давай на моём примере. Сделай в ООП классы «чётные числа» и «положительные числа». И покажи, что new Even(6) == new Positive(6)

monk ★★★★★
()
Ответ на: комментарий от ioway

у меня 1000 комментов на страницу :)

Debasher ★★★★★
() автор топика
Ответ на: комментарий от somequest

У каждого объекта может быть только один непосредственный класс

С чего это?

С того, что объект создаётся конструктором класса. И конструкторы разных классов не могут вернуть равные объекты.

monk ★★★★★
()
Ответ на: комментарий от somequest

На самом деле адекватный взгляд, с точки зрения ООП — and и or являются экземплярами Method или Function, а a и b — произвольные выражения, возвращающие объекты типа Boolean.

Почти так и есть. a и b — произвольные предикаты (функции от одного аргумента, возвращающие boolean), (and? a b) тоже возвращает предикат. Суть в том, что если некое значение удовлетворяет двум предикатам, то один из предикатов должен быть супертипом для другого, иначе для этого значения метод не определён.

monk ★★★★★
()
Ответ на: комментарий от hateyoufeel

ну да,

-А что такое «дочерний тип» в контексте зависимых типов?

-Подмножество значений супертипа.

собственно, вот вы сами и пояснили, что сущность зависимых типов — это параметризация одного типа, а не создание совершенно разных типов.

на крайняк Haskell + Liquid Haskell

и как же там выполнимо указанное условие?

anonymous
()
Ответ на: комментарий от anonymous

супертип — это шаблон

Ну где он шаблон? Например, супертип = «целые числа», подтип = «чётные целые числа».

сущность зависимых типов — это параметризация одного типа

Если произвольный предикат на множестве — это параметризация, то да.

Но можешь показать на любом ООП-с-шаблонами, например, параметризацию списка условием: «списки, первый элемент которых, больше чем сумма остальных элементов». Или параметризацию вектора условием на сортировку.

monk ★★★★★
()
Ответ на: комментарий от no-such-file

идей не существует, наш мир материален.

Да ладно! Бесконечные числовые последовательности, функциональные пространства (бесконечномерные), множество Дирихле — это всё не существует (вместе с большей частью математики)?

monk ★★★★★
()
Ответ на: комментарий от monk

Бесконечные числовые последовательности, функциональные пространства (бесконечномерные), множество Дирихле — это всё не существует (вместе с большей частью математики)?

Существуют у тебя в мозге, т.е. на конкретном материальном носителе. А так, вообще, самих по себе их не существует.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Существуют у тебя в мозге

Давай возьмем, к примеру, удар током от фазы розетки. До тех пор, пока ты не обосрался с этим спором, в твоем мозге он существовал. Ты работал электриком 10 лет, и он тем не менее существовал у тебя в мозге, в качестве иллюзии, заблуждения. Это происходило от того, что ты не понимаешь, что такое электрический ток, и как он себя ведет *реально*. После того, как тебя ткнули рожей в Г, он в твоем мозге перестал существовать, по всей видимости. Так материален он или нет? По твоему получается, что иллюзия — тоже материальна. Но тогда все материально. А все — есть материально == все есть все. В таком случае нет ничего материального, поскольку не с чем его сопоставлять. Нет никакой материи, по твоей логике. Нет разницы между иллюзией и реальностью. И тем не менее, например долг твой материален, и он никуда не делся, несмотря на то, что ты делаешь вид, что ничего не должен.

anonymous
()
Ответ на: комментарий от no-such-file

Вот тебе годная грань между реальным и нереальным. Бесконечные числа не существуют, поэтому они нереальны. Представление о них реально, и оно существует. Другой пример. Кто-то кому то гипотетически может быть должен денег. Этот долг нереален, поэтому его не существует. Однако, если кто то кому-то НЕгипотетически должен денег, этот долг реален, и он висит на нем, независимо от того, что происходит в голове у должника. К примеру, должник может представить, что этого долга не существует в реальности однако на наличие этого долга это представление повлиять не может.

anonymous
()
Ответ на: комментарий от anonymous

Однако, если кто то кому-то НЕгипотетически должен денег, этот долг реален, и он висит на нем, независимо от того, что происходит в голове у должника.

Но зависимо от того, что происходит в голове у кредитора. Если и кредитор и должник забудут, то долг пропадёт.

«Реальность словам придают люди. Когда умрет последний христианин, уйдет из мира и Христос, когда умрет последний марксист, исчезнет вся объективная реальность, и ничто не скопируется и не сфотографируется ничьими чувствами, и ничто не дастся никому в ощущение, существуя независимо, как не происходило этого ни в Древнем Египте, ни в Византийской империи.» (с) Пелевин

monk ★★★★★
()
Ответ на: комментарий от monk

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

исчезнет вся объективная реальность

существует противоречие. Само понятие исчезновения предполагает то, что кто-то должен наблюдать это исчезновение. Вот, это было, теперь — нет. Исчезновение определяется прошлым наличием чего-то. Но если нет того, кто знает о наличии, нет и того кто знает об исчезновении, следовательно, нет и самого исчезновения. Так то. Интерпретация Пелевина поверхностна. Это типичный случай, описанный пословицей «слышал звон, да не знает где он».

anonymous
()
Ответ на: комментарий от anonymous

Но если нет того, кто знает о наличии, нет и того кто знает об исчезновении, следовательно, нет и самого исчезновения.

То есть Луна определённо не существует, когда на неё никто не смотрит?

monk ★★★★★
()
Ответ на: комментарий от monk

Рассматривать что-либо, включая луну, как самостоятельный объект, независимый от наблюдателя вообще бессмысленно. Конечно ее не существует, как самостоятельной субстанции, тут Пелвин отчасти прав, ее существование определяется тем, что ее кто-то наблюдает.

Однако, говорить о ее «несуществовании» тоже нельзя, поскольку несуществование определяется существованием.

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

Если мы говорим, что луна не существует, значит предполагается, что она может существовать, или существовала когда-то. Если же ее никогда не существовало, значит и не-существование тоже невозможно.

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

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

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

anonymous
()
Ответ на: комментарий от Debasher

да вы же поехавшие! что вы несёте! вам что, делать нехер?!

Вот что ООП делает с людьми.

no-such-file ★★★★★
()
Ответ на: комментарий от anonymous

там написано

там написано то же самое, что сказал я, тащемто. то, что ты этого не понимаешь, это уже твои личные проблемы

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Unlike objects in Java, Ruby or other so-called “object oriented” languages

если считать изначальный смысл, то м.б. но сейчас Java и Ruby (особенно руби) считаются хорошими примерами ООП языков, так что, Алан Кей не прав.

next_time ★★★★★
()
Ответ на: комментарий от monk

Ну где он шаблон? Например, супертип = «целые числа», подтип = «чётные целые числа».

template <int a, int b>
class Distance
{  int value;
public:
    int operator=(int x)
    {
        if(x < a || x > b) throw std::out_of_range("Ошибка в классе Distance");
        return value = x;
    }
    operator int() const
    {
        return value;
    }
};


Distance<0, INT_MAX> a; a = 3; //от нуля до максимума, который
//может содержать int
Distance<INT_MIN, INT_MAX> b; b = 4;
//полный диапазон
Distance<1, INT_MAX> c; c = a + b; //от единицы до максимума
Distance<1, 6> d; d = a + 1; //множество от 1 до 6 включительно

Предвидев ваши замечания, отвечаю: исключение не обязательно, вместо него можно заставить держать выход за рамки с помощью boost::none, например. Пределы INT_MAX и INT_MIN также не являются принципиальными ограничениями: вы можете использовать int64_t или любой класс вместо инт, т.о., можно, скажем, задавать подмножества от 0 до бесконечности.

Но можешь показать на любом ООП-с-шаблонами, например, параметризацию списка условием: «списки, первый элемент которых, больше чем сумма остальных элементов».

по аналогии с предыдущим примером, если я вас правильно понял

Или параметризацию вектора условием на сортировку.

std::map: хотя внутри там не вектор, а дерево, но написать свой вариант с вектором, а не деревом, внутри, никто не запрещает

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.