|
|
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorych, и какой язык программирование позволит переопределить метод так, чтобы он возвращал обьект другого типа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:14:16 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
и хто мешает определить для целочисленного типа метод целочисленного деления, как в паскале. Вирт был не дурак, знал что в учебном языке нельзя реализовывать хоть и удобные вещи, но те которые противоречат здравому смыслу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:19:44 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p начинаю пониматьegorychещё раз: чему будет равно значение переменной с в таком случае: int c = half( 1 ); ??? 0.5, конечно же. Прошу прощения, невнимательно прочитал. half ( 1 ) вернет 0.5. Чему будет равно с программно определяется конструктором Integer; теоретически этот вопрос смысла не имеет, т.к. LSP требует чтобы изначально программа была определена в терминах Float, так что никаких Integer она содержать не должна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:21:47 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p начинаю пониматьegorychдо тех пор, пока клиентский код не будет надеяться на то, что изменение высоты прямоугольника не приводит к изменению его ширины. ЗЫ дежавю ))) Вы опять про переопределенные методы (сеттеры). Нельзя их использовать, если хотите применять принцип Лисков, вот и вся задача. да. при переопределении метода появляются проблемы.. l s p начинаю понимать И это вовсе не значит, что "квадрат с переопределенными сеттерами сторон не является подтипом прямоугольника согласно LSP". Это значит лишь то, что данный вопрос неразрешим при помощи LSP, ни в ту ни в другую сторону. про "и это вовсе не означает" другими словами можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:25:07 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p начинаю пониматьtchingiz)) я выполнил substitution, и o1 is substituted for o2, дале я жду, что бы поведение программы было неизменным. the behavior of P is unchanged поскольку поведение программы до субститушион и после отличаются, то \ делаю вывод, что int не есть подтип float/ { return 1/2; } и { return 1.0/2; } - разные программы, хотя бы только потому что приводят к разным результатам, так что отрицать это бессмысленно; заменить объект o2 на o1 в программе P значит вместо P(o2) выполнить P(o1). А вы вместо P1() выполняете P2(). Нет никаких сомнений в том, что разные программы могут иметь разное поведение)))? гут. принято в статье в примере Код: plaintext 1. 2. 3. 4. 5. 6. 7. действительно передается разные параметры. с делением надо сделать, чтобы вызвалось разное деление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:31:45 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingiz, вся фишка в том, что метод переопределяеться на онове разных входных параметров и возвращает резултат одного типа(в данном случае void). при делении - параметры одного типа(так как инт есть флоат) и возвращеться один тип флоат(так как флоат не есть инт) это говорит о том что нормальное деление нужно оставить, а целочисленное создать используя новое имя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:59:02 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
ааааа, дошло. нефиг. сделайте мне модель предметной области. Точно как в математике. Это техническое задание. На множестве целых четыре операции полностью определенные три сложение, вычитание и умножение - на вход принимают два инта на выходе один. Частично определенное деление - на вход принимает два инта, на выходе один. в естественных случаях деление выбрасывает эксепшен (если нет целого). Тоже с рациональными числами только деление всюду определено, все операции на вход принимает два рациональных на выходе одно. И чтобы деление называлось одинаково для обоих классов --- значком слэш. И чтобы целые наследовались из рациональных. И не объясняйте, что математика плохая, а мне надо не то, что в тз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 02:22:30 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingiz, математика хорошая, ты мне скажи какой математик тебе сказал что целое поделить на целое это целое(про то что операции определены на множестве целых, дак это ты сам придумал. тут уже упоминалось про то что метод класса не обязан возвращать результат собственного типа, а скорее наоборот, такие методы довольно редки) Ты имееш ввиду что создатели многих(не си-подобных) языков придурки, и они неправы в том что реализовали нормальное деление для целых. И в 3-м питоне случайно заменили цел. деление на обычное, что-бы совместимость с 2-й(которая унаследовала деление от си) потерять :) ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 02:48:20 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
я имею ввиду, что на множестве целых чисел операция деления определена не на всем множестве целые >< целые, а на некоторых парах не определена. и требуется реализовать именно эту функцию деления, а не какую либо другую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 05:37:02 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
о том, как вводится множество целых чисел с операциями сложения, отнимания, умножения и деления мне рассказал Пеано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 05:38:38 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
Вопрос? Вы определились с задачей? Как только станет ясна задача и будет определено поведение, отсюда естественным образом получается контракт типа. Контракт: 1. Может быть таким 2. Может вести себя так 3. Ожидаем таких-то манёвров 3. Предусловие, постусловие, ивариант 4. Прочее Как только определен контракт, сразу всё станет на свои места. Тип Т исполняет контракт. Тип Р, являясь подтипом Т тоже обязан исполнить контракт, или он не может быть унаследован от Т. Если тип Р должен иметь дополнительную функциональность (но не измененную!!!), наследуйте котракт, но в этом случае не требуйте, чтобы потребитель первого варианта контракта знал о новых(а не измененных. Менять поведение нельзя) мульках второго контракта. А вы с примерами разных делений просто переопределяете контракт на ходу и пытаетесь что-то вывести. С Уважением, ЗЫ: Очень интересный топик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 09:30:48 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
мнение, вот реально +500 )) есть как бы понятие "множество целых чисел". Его контракт известен пользователю класса Integer. Есть понятие "множество рациональных чисел", его контракт известен пользователю класса Float. Контракты практически одинаковы, с одним маленьким различием, касательно операции деления. Если мы хотим отнаследовать Integer от Float, то нам необходимо разрешить противоречие, заключённое в этом маленьком различии. Ибо парадигма объектно-ориентированного программирования нам говорит, что класс-наследник должен полностью выполнять контракт базового класса. В случае целых и рациональных чисел наследуемый класс не может полностью выполнить контракт базового. Вот и всё, о чём ещё говорить? Кстати, и в питоне и в паскале, хотя разработчики этих языков и были умными людьми, всё одно не сделали int наследником float. Почему бы? И в конце концов, операция деления целых чисел, возвращающая рациональное число приводит к появлению неоправданного оверхеда на многократное приведение типов. "С" и его наследники с оверхедом борятся, другим языкам на оверхед наплевать, вот отсюда и разница в реализации. В случае квадрата и прямоугольника - такая же история с невозможностью полного выполнения контракта базового класса. Кстати, а почему, собственно, квадрат наследник прямоугольника? почему не ромба? почему не равнобедренного многоугольника? Совсем неочевидный выбор базового класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 13:12:16 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingizпочему целые числа нельзя наследовать из рациональных? Потому что наследник накладывает ограничения на св-ва и методы родителя. То же самое с квадратом - он накладывает ограничение на прямоугольник. В этом случае такие св-ва и методы должны быть переопределены. Наследование в чистом виде работает если нет ограничений, а только добавляются новые св-ва и методы. На самом деле есть просто разные типы данных, для каждого типа определены свои операции, но могут использоваться "чужие" с возможностью отказа выполняться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 14:51:49 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
а почему в моем варианте не сохраняеться контракт, ведь у мну тип инт наделяеться новым поведением под названим целочисленное деление и остаток от деления, а рациональное деление остаеться таким каки оно и было для рац. чисел. а про квадрат, я согласен, при изменении одной стороны вторая изменяться не должна(по контракту). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 16:44:03 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorychмнение, Кстати, и в питоне и в паскале, хотя разработчики этих языков и были умными людьми, всё одно не сделали int наследником float. Почему бы? Пскаль это процедурный язык, там ООП до Броланда и не пахло, а в создатель питона взял поведение целих и рац чисел с языка СИ. А главные ограничения на наследования инт от флоат наложила машина. Ведь там уже забиты понятия целых и вещественных И в языке паскаль - поведение целых и вещественных типов соответсвует наследованию инт от риал вместо риал подставить целое можно, а наоборот нельзя, при делении целых - ответ вещественный, для целых определены новые методы mov div. А насчет питона, дак это только в 3-е изменили поведение деления на то каким оно должно быть(не в плане удобства, а в лгики, мне нравиться то что в си деление целочисленное) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 16:54:15 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN, попробуйте формально записать свой контракт. Повторяю: определяет контракт. Какое поведение в него заложите, такое и должен исполнять тип. Заложите целые, остатки, пр. (общий случай для целого/вещественного, или может быть еще более общий для комплексных чисел) - и все эти типы (целые, вещественные, комплексные) его реализуют, не вижу противоречия для организации системы типов при помощи механизмов наследования. Если позволяет выбранный язык, если это удобно и полезно в конкретном решении, если... если..., но это уже реализация. Если тип не выполняет контракт, например постусловие - возвращаемый результат целое число, а мы возвращаем вещественное, то это тот случай про который я написал. Если контракт не накладывает ограничение на возвращаемый тип, а говорит о том, что вернуться должен математический (какой-нибудь из них) результат деления и используемый язык позволяет записать это формально (например python с динамической типизацией), то обратно - нет препятствий для выстраивания иерархии наследования. Нужно ли это - этого вопроса мы не касаемся. Вот как-то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 17:01:04 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
мнение, Я слеп, бьюсь головой об это деление(и тут я уверен что прав ведь логично что контракт деление определяет возвращение вещественного числа). Но как тода быть со сложением, разницой и умноженим. Тогда выйдет что сума целых будет вещественное число что правильно относительно парадигмы ООП, но не удобно при применении. Да каюсь, - также как и квадрат относительно прямоугольника, целое - это часный случай вещественного, а наследование зделать можно но бесмысленно. Здаюсь и в этот топик не возвращаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 17:42:32 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
мнениеКак только определен контракт, сразу всё станет на свои места. Тип Т исполняет контракт. Тип Р, являясь подтипом Т тоже обязан исполнить контракт, или он не может быть унаследован от Т. egorych+500 ... есть как бы понятие "множество целых чисел". Его контракт известен пользователю класса Integer. Есть понятие "множество рациональных чисел", его контракт известен пользователю класса Float. Что-то я, видимо, по меньшей мере одного из вас не понял. мнение пишет про один контракт, а egorych уже откуда-то взял два. egorychВ случае целых и рациональных чисел наследуемый класс не может полностью выполнить контракт базового. Почему не может-то? Для деления рациональных чисел, он требует, чтобы: 1) второй операнд был отличен от нуля; 2) возвращаемый результат был рациональным числом. Деления для целых чисел в полной мере удовлетворяет обоим требованиям. Вот и всё, о чём ещё говорить? _модПотому что наследник накладывает ограничения на св-ва и методы родителя. То же самое с квадратом - он накладывает ограничение на прямоугольник. В этом случае такие св-ва и методы должны быть переопределены. Наследование в чистом виде работает если нет ограничений, а только добавляются новые св-ва и методы. Вы можете привести пример наследования, при котором наследник не накладывает ограничения ни на свойства ни на методы родителя, но при этом и не совпадает с ним (т.е. не просто class Child : Parent {})? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 19:15:55 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
йцуфывegorych есть как бы понятие "множество целых чисел". Его контракт известен пользователю класса Integer. Есть понятие "множество рациональных чисел", его контракт известен пользователю класса Float. Что-то я, видимо, по меньшей мере одного из вас не понял. мнение пишет про один контракт, а egorych уже откуда-то взял два.ну бог ты мой, про математику забыли, да? егорыч взял оба контракта из математики. когда возникло программирование, было такое странное желание, что типы данных "целое" и "рациональное" в программировании сделать такими-же, как они определены в математике, и знаете что? - такая их реализация оказалась вполне востребованной. ну да, кстати, лучше уж "вещественное", чем "рациональное", что, правда, смысл не меняет. йцуфывegorychВ случае целых и рациональных чисел наследуемый класс не может полностью выполнить контракт базового. Почему не может-то? Для деления рациональных чисел, он требует, чтобы: 1) второй операнд был отличен от нуля; 2) возвращаемый результат был рациональным числом. Деления для целых чисел в полной мере удовлетворяет обоим требованиям. Вот и всё, о чём ещё говорить?контракт деления рациональных чисел действительно такой. вот контракт деления у целых - другой. В этом и проблема. При реализации класса целых как наследника рациональных, мы нарушаем контракт деления целых чисел, которое знает и использует очень большое количество людей. Как я понимаю, создатели питона.3 решили на них положить - теперь вот думают, чего делать дальше. Слишком много оказалось надо переписывать. Хотя могу и ошибаться, я с питонами не дружу )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 23:28:17 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
йцуфывВы можете привести пример наследования, при котором наследник не накладывает ограничения ни на свойства ни на методы родителя, но при этом и не совпадает с ним (т.е. не просто class Child : Parent {})? Конечно. Parent: Документ, св-ва: дата, содержание, метод: поиск по дате или содержанию Child: Накладная, доп. св-ва - список товаров, методы: поиск по товару все методы Документ без ограничений обслуживают Накладные, ничего не зная о доп. св-вах и методах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2009, 10:53:30 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
_модйцуфывВы можете привести пример наследования, при котором наследник не накладывает ограничения ни на свойства ни на методы родителя, но при этом и не совпадает с ним (т.е. не просто class Child : Parent {})? Конечно. Parent: Документ, св-ва: дата, содержание, метод: поиск по дате или содержанию Child: Накладная, доп. св-ва - список товаров, методы: поиск по товару все методы Документ без ограничений обслуживают Накладные, ничего не зная о доп. св-вах и методах А теперь вопрос к йцуфыв. Можете привести обратный пример (обратный к Вашему вопросу). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2009, 13:37:57 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
мнение Дык float - int, прямоугольник-квадрат ну и т.д ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2009, 13:50:22 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorych ну да, кстати, лучше уж "вещественное", чем "рациональное", что, правда, смысл не меняет. не лучше, рациональные - это минимальное поле, содержащее целые. Меньше сущностей меньше места для посторонних разговоров, типа не от того породил, как с квадратами было ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2009, 19:49:17 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
то есть, будем считать что требуемая реализация целых рациональных с использованием наследования на с++ трудностей не представляет. Код может быть написан. два формальных примера выполненных на с++ с использованием наследования уважаемая публика, начиная с Лисков, упорно отказывается признавать "правильным" наследованием. /* если вспомнить определение Страуструпа "класс это пользовательский тип", то обнаружим, что есть неопределенность в терминах класс и тип. То что есть подтипом по Страуструпу, не есть подтипом по Лисков*/ а что такое контракт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2009, 20:05:04 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
посмотрите как реализовано наследование абстрактных классов чисел в 3-м питоне http://www.ibm.com/developerworks/ru/library/l-python3-2/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2009, 11:30:22 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35978185&tid=1344470]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
152ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 460ms |

| 0 / 0 |
