|
|
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingizя тоже пример с квадратами- прямоугольниками рассматриваю уже год это и не понимаю. Я все больше склоняюсь к мысли, что заменять T на S и требовать неизменности поведения любой программы бессмысленно. Что делать с программой, которая вообще объекты не использует, а тупо выводит на экран название используемого класса (типа)? Ее поведение изменится в любом случае, так что можно придти к выводу, что в природе не существует "подтипов" вообще... Это неконструктивно)) tchingizдавай так. деление явно должно быть перегружено берем программу Код: plaintext 1. 2. 3. при подстановке плавающей единицы результат будет 0.5 результат будет всегда 0, ведь возвращаемый тип - int. думаю, вы имели ввиду что-то вроде этого: Код: plaintext 1. Вот возьмем функцию Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:49:46 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
а почему результат обработки наследника должен совпадать с результатом обработки родителя? Пример: есть класс форма. От его наследуеться класс форма с кнопкой. Медод вывода на экран даст разные результаты. А что, форма с кнопкой не являеться формой? а про деление нацело - дак это и неправильно. потомучто в природе в общем случае даже деление целых чисел дает действительный результат резльтат, или, при делении на ноль, результат не число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:58:04 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNа почему результат обработки наследника должен совпадать с результатом обработки родителя? Никто не говорит, что должно. Требование, как я его понимаю, совершенно иное: чтобы для всех возможных экземпляров класса-наследника существовал хотя бы один экземпляр класса-родителя такой, что результат его обработки в любой программе аналогичен. ZyK_BotaNПример: есть класс форма. От его наследуеться класс форма с кнопкой. Медод вывода на экран даст разные результаты. А что, форма с кнопкой не являеться формой? Всё здесь в порядке: в классе "форма", разумеется, есть объекты, поведение которых полностью идентично поведению некоторому объекту класса "формы с кнопкой"; по-моему, это очевидно? ZyK_BotaNа про деление нацело - дак это и неправильно. потомучто в природе в общем случае даже деление целых чисел дает действительный результат резльтат, или, при делении на ноль, результат не число. Так о том и спич - надо ли требовать, чтобы результат деления был того же типа что и аргументы или нет? Возьмите два рациональных числа, второе из которых не ноль; поделите первое на второе, обязательно получите рациональное число. А вот целые числа таким свойством не обладают. Вот и вопрос: значит ли это, что целые числа не являются подклассом рациональных (как не обладающие свойством, которым обладают рациональные числа) или все-таки является. Вот еще один довод в пользу того, чтобы не считать обязательным сохранение всех свойств типа (а не объектов типа ): возьмем некоторые тип T и подтип S, пусть существует объект о1, принадлежащий Т и не принадлежащий S, но тогда T обладает тем свойством, что содержит обхект о1, а S таким свойством не обладает, значит S не являеттся подтипом Т, полученное противоречие означает что объекта о1 не существует, или, иными словами, любой подтип совпадает со своим надтипом. Это, опять же, неконструктивно))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:07:21 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
mayton 2 Все Еще раз напоминаю, что без привязки к предметной области, наша дискуссия будет просто философствованием. Будет-ли квадрат наследником прямоугольника или нет - это определит сама прирада задачи. Быть может в какой-нибудь геометрии Лобачевского-Римана или Егорыча-Чингиза существует "точка" с "ненулевой массой" или квадрат с отрицательной площадью. Всё будет иметь своё место и смысл!! Но..... как только мы ОПРЕДЕЛИМСЯ с этой природой.при привязке к предметной области вопрос переходит в практическую плоскость и сразу становится оффтопиком, потому как тред начался со слов "философский ступор" ну и потеряет свою остроту и интересность. Ну а если серьёзно, то я в выделенной цитате не вижу разногласий с моей позицией. Только от задачи зависит, может-ли квадрат наследоваться от прямоугольника, ромба, параллелограмма, круга или точки, или не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:11:26 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p не понимаю Так о том и спич - надо ли требовать, чтобы результат деления был того же типа что и аргументы или нет? Возьмите два рациональных числа, второе из которых не ноль; поделите первое на второе, обязательно получите рациональное число. А вот целые числа таким свойством не обладают. Вот и вопрос: значит ли это, что целые числа не являются подклассом рациональных (как не обладающие свойством, которым обладают рациональные числа) или все-таки является. на мой взгляд ответ однозначный - целые числа не являются подклассом рациональных для случаев, когда операция деления определена. Потому что я, как клиент класса Float, могу совершенно спокойно написать такой код: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:26:39 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingiz Код: plaintext 1. 2. 3. 4. 5. при подстановке o1, целой единицы вызовется целое деление - результат будет 0. при подстановке плавающей единицы результат будет 0.5 тут ошибочка естественно Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:34:19 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorychна мой взгляд ответ однозначный - целые числа не являются подклассом рациональных для случаев, когда операция деления определена. Потому что я, как клиент класса Float, могу совершенно спокойно написать такой код: Код: plaintext 1. 2. А что это за язык? Вы, что ли, имеете ввиду различные машинные представления int и float? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:35:37 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p не понимаю Код: plaintext не согласен. в теле программы x заменим на 1. упростим. параметр не нужен Код: plaintext Код: plaintext вернут разные результаты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:37:08 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p не понимаюtchingizя тоже пример с квадратами- прямоугольниками рассматриваю уже год это и не понимаю. Я все больше склоняюсь к мысли, что заменять T на S и требовать неизменности поведения любой программы бессмысленно. Что делать с программой, которая вообще объекты не использует, а тупо выводит на экран название используемого класса (типа)? Ее поведение изменится в любом случае, так что можно придти к выводу, что в природе не существует "подтипов" вообще... Это неконструктивно)) . это к Лисков, она у нас получатель премии Тьюринга. Думаю ее принцип есть следствием отсутствия человеческих определений в ооп, и желанием понять, что же имеется ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:40:31 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingizне согласен. в теле программы x заменим на 1. упростим. параметр не нужен Код: plaintext Код: plaintext вернут разные результаты Так вы не объект заменили, вы программу (функцию) изменили. Вообще, с чего вдруг второй вариант написан "in terms of int", а не "in terms of float"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:40:51 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingizэто к Лисков, она у нас получатель премии Тьюринга. Думаю ее принцип есть следствием отсутствия человеческих определений в ооп, и желанием понять, что же имеется ввиду. Так я все никак не увижу где бы Лисков требовала заменяемости типа родителя на тип наследника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:42:16 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
псевдокодом написал, имелось ввиду следующее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:42:43 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
2 l s p не понимаю и сделаем всё четко по принципу: T - float, S - int; для любого int'а есть соответствующий float, такой, что если в любой программе использующей эту функцию заменить его на соответстущий int, то поведение программы не изменится; что ж, для с/с++, насколько мне известно, это действительно так, так что int is subtype of float... имхо, это не то, что имеет ввиду Лисков, так как в любой программе использующей это функцию, не должно сначала выполняться преобразование типа int в float, так как тогда, на деле передается объект из T. Склонен считать, что подстановка объектов должна выполнятся в теле функции P ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:45:42 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingiz, оператор "/" переопределен для разных типов(int, float) так, что несет разную смысловую нагрузку, поэтому очевидно что при работе с разными типами, получаем разный результат. а если бы создатели языка действительно наследовали int от float :), то оператор деления нельзя было бы переопределить как деление нацело и в итоге мы бы получали в результате 0.5 даже в случае целого типа пример с делением не доказал невозможность наследования целых от рациональных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:45:55 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorych, ну и оператор деления для Integer определить с той же семантикой, как у встроенного типа - и всё, привет семье. Неожиданные ошибки времени выполнения в клиентском коде, использующем Integer через указатель на базовый класс ( Float ) обеспечены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:46:48 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorychпсевдокодом написал, имелось ввиду следующее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Отлично, и что же вас смущает? Какой бы Integer в какой угодно программе вы бы ни взяли, вы всегда можете подыскать такой Float, что замена этого Integer'а на этот Float даст полностью аналогичное поведение программы. (например, 1 заменить на 1.0, 2 на 2.0 и т.д.). Функция half при этом совершенно не должна переписываться под тип Integer - замене ведь подлежат только объекты; и возвращать она всегда будет Float, что для Integer'ов, что для Float'ов, и для 1 и для 1.0 возвращать будет одно и то же; по мне так, все шито-крыто)) (в терминах квадратов-прямоугольников: поскольку для любого квадрата всегда можно указать прямоугольник, который ведет себя абсолютно так же (обе стороны которого равны стороне квадрата, очевидно), то, согласно Лисков, квадрат является подтипом прямоугольника) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:49:09 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNа если бы создатели языка действительно наследовали int от float :), то оператор деления нельзя было бы переопределить как деление нацело и в итоге мы бы получали в результате 0.5 даже в случае целого типакак это возможно, интересно? Что будет вот здесь: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:51:06 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p начинаю пониматьtchingizэто к Лисков, она у нас получатель премии Тьюринга. Думаю ее принцип есть следствием отсутствия человеческих определений в ооп, и желанием понять, что же имеется ввиду. Так я все никак не увижу где бы Лисков требовала заменяемости типа родителя на тип наследника. тут недопонял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:53:26 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorychegorych, ну и оператор деления для Integer определить с той же семантикой, как у встроенного типа - и всё, привет семье. Неожиданные ошибки времени выполнения в клиентском коде, использующем Integer через указатель на базовый класс ( Float ) обеспечены. А, переопределением операторов заняться хотите )) это неприлично, и приводит к неразрешимости вопроса о подтипе по Лисков: If type T denotes a set of values that carry their own behavior, and if values of type S can override some of T values behavior, the LSP is undecidable. Indeed, a mechanical application of LSP must at least be able to verify that all methods overridden in S terminate whenever the corresponding methods in T terminate. This is generally impossible. К чему переопределять-то? Что, операция деления двух целых чисел не такая, как для деления двух рациональных? Чему противоречит то, что результат будет нецелым? Вы же сами себя в рамки замкнутости относительно деления и загоняете, а потом говорите что раз эти рамки есть то наследование невозможно)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:55:02 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p начинаю понимать (в терминах квадратов-прямоугольников: поскольку для любого квадрата всегда можно указать прямоугольник, который ведет себя абсолютно так же (обе стороны которого равны стороне квадрата, очевидно), то, согласно Лисков, квадрат является подтипом прямоугольника)до тех пор, пока клиентский код не будет надеяться на то, что изменение высоты прямоугольника не приводит к изменению его ширины. ЗЫ дежавю ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 00:57:09 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p начинаю пониматьtchingizне согласен. в теле программы x заменим на 1. упростим. параметр не нужен Код: plaintext Код: plaintext вернут разные результаты Так вы не объект заменили, вы программу (функцию) изменили. Вообще, с чего вдруг второй вариант написан "in terms of int", а не "in terms of float"? )) я выполнил substitution, и o1 is substituted for o2, дале я жду, что бы поведение программы было неизменным. the behavior of P is unchanged поскольку поведение программы до субститушион и после отличаются, то \ делаю вывод, что int не есть подтип float/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:00:20 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p начинаю пониматьК чему переопределять-то? Что, операция деления двух целых чисел не такая, как для деления двух рациональных? Чему противоречит то, что результат будет нецелым? Вы же сами себя в рамки замкнутости относительно деления и загоняете, а потом говорите что раз эти рамки есть то наследование невозможно))ещё раз: чему будет равно значение переменной с в таком случае: int c = half( 1 ); ??? операция деления целых чисел должно возвращать целое число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:00:32 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorychдо тех пор, пока клиентский код не будет надеяться на то, что изменение высоты прямоугольника не приводит к изменению его ширины. ЗЫ дежавю ))) Вы опять про переопределенные методы (сеттеры). Нельзя их использовать, если хотите применять принцип Лисков, вот и вся задача. И это вовсе не значит, что "квадрат с переопределенными сеттерами сторон не является подтипом прямоугольника согласно LSP". Это значит лишь то, что данный вопрос неразрешим при помощи LSP, ни в ту ни в другую сторону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:03:41 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorychl s p начинаю пониматьК чему переопределять-то? Что, операция деления двух целых чисел не такая, как для деления двух рациональных? Чему противоречит то, что результат будет нецелым? Вы же сами себя в рамки замкнутости относительно деления и загоняете, а потом говорите что раз эти рамки есть то наследование невозможно))ещё раз: чему будет равно значение переменной с в таком случае: int c = half( 1 ); ??? операция деления целых чисел должно возвращать целое число. с каких это пор? это вы почерпнули из си-подобных языков(дак там результат деления не цлое, вас ввело в заблуждение то что операция деления и деления нацело обозначаеться одним оператором "/")? Например: в пскале при делении целого на целое ответ рациональный, в 3-м питоне тоже деление не цлеочисленное , интересно почему это зделали? :) наврное они незнали что в результат деления целых это целое. в случае int c = half( 1 ); - необходимо зделать приведение типов. с каких это пор обьект базового класса присваевался ссылке производного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:10:35 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
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(). Нет никаких сомнений в том, что разные программы могут иметь разное поведение))) egorychещё раз: чему будет равно значение переменной с в таком случае: int c = half( 1 ); ??? 0.5, конечно же. egorychоперация деления целых чисел должно возвращать целое число. Ну кто вам такое сказал-то? Кому она это должна? Это называется "порочный круг" в логике; вы требуете, чтобы деление было замкнуто для целых чисел, а потом сетуете на то, что он возвращает не те результаты, что для рациональных; ну а функция проверки числа на ноль - она-то имеет тип bool, а почему же не тип int для целых и не тип float для вещественных? чем она лучше или хуже функции взятия половины числа, а? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2009, 01:13:36 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35959736&tid=1344470]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
170ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 210ms |
| total: | 499ms |

| 0 / 0 |
