|
|
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
mayton, я уже упоминал про полиморфизм(работу с квадратом как с правильным многоугольником) как это связуеться с методами проверки и конструкторами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 17:31:04 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNmayton, я уже упоминал про полиморфизм(работу с квадратом как с правильным многоугольником) как это связуеться с методами проверки и конструкторами? формулы для разных фигур будут разными. Например в базовом классе мноугольник определить виртуальный абстрактный метод площадь. Каждая фигура - многоугольник, квардат, прямоугольник - будут считать по своим оптимальным формулам. Суть же ООП, это не слепить все в одну универсальную модель. А как раз крассиво разнести все по полочкам учитывая контекст использования абстракций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 17:47:04 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNmayton, я уже упоминал про полиморфизм(работу с квадратом как с правильным многоугольником) как это связуеться с методами проверки и конструкторами? Господи... да забудь-же ты про квадрат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 18:10:26 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
математически, или геометрически, квадрат является частным случаем прямоугольника ( и, кстати, ромба, о чём торжественно забыли ), а вот с точки зрения программирования, вообще-то, не всегда. Как раз попалась мне одна книжица, процитирую, пожалуй, корифеев: Саттер & Александреску "Стандарты программирования на С++" Рассмотрим 2 класса - Square ( квадрат ) и Rectangle ( прямоугольник ), каждый из которых имеет виртуальные функции для установки их высоты и ширины. Тогда Square не может быть корректно унаследован от Rectangle, поскольку код, использующий видоизменяемый Recatangle, будет полагать, что функция SetWidth не изменяет его высоту ( независимо от того, документирован ли данный контракт классом Rectangle явно или нет ), в то время как функция Square::SetWidth не может одновременно выполнить этот контракт и свой инвариант "квадратности". Но и класс Rectangle не может корректно наследовать классу Square, если его клиенты Square полагают, например, что для вычисления его площади надо возвести в квадрат ширину, либо используют какое-то иное свойство, которое выполняется для квадрата и не выполняется для прямоугольника. Описание "является" для открытого наследования оказывается неверно понятым при использовании аналогий из реального мира: квадрат "является" прямоугольником в математическом смысле, но с точки зрения поведения Square не является Rectangle. Вот почему вместо "является" мы предпочитаем говорить "работает как" ( или "используется как" ) для того, чтобы такое описание воспринималось максимально правильно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 18:48:11 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorych, Это многое объясняет, но все же, ИМХО предпочтительнее использовать понятие «является» а не «работает как» в плане того же полиморфизма. Меня убил пример, когда круг наследовался от точки, точка от координат. И потом в массиве точек могли хранится круги. Ведь круг только внес понятие радиуса и переопределил метод отрисовки. Но логически наследование бредовое, хоть круг работает как точка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 19:12:14 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
прямоугольник должен быть immutable или должна быть возможость у кокретого обхекта сменить класс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 19:14:04 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
http://www.cs.washington.edu/research/projects/cecil/www/cecil.html Cecil has predicate objects, which allow virtual "subclasses" to be defined carrying specialized methods that override their parent's methods whenever some boolean predicate over the object is true. In this way, inheritance can be used to model time-varying and/or state-dependent properties of objects just like permanent properties of objects. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 19:18:43 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
_модtchingizнаследование квадратов из прямоугольников нарушает достаточно очевидный принцип Барбары Лисков Liskov Substitution Principle (LSP) и поэтому не может считаться наследованием. Это не проблема - достаточно переопределить ненужные методы в NULL и все будет нормально какие методы в данном случае. пример простой. думаю, проблема. x принадлежит X, а X включается в Y. X подкласс Y. все функции зависящие от x должны вырабатывать одинаковый результат независимо от того, x обьявлен как X x; или Y x; почему целые числа нельзя наследовать из рациональных? целые не замкнуты относительно деления. 1.0 / 2.0 вырабатывает результат отличный от 1/2 что нарушает lsp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 21:53:14 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
SQL_Lamertchingiz, Вот все ты с этими прямоугольниками успокоиться не можешь :) я пропустил осмысленный ответ? )))))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 21:54:08 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
maytonNafя так понимаю: квадрат таки наследуется от прямоугольника, но инкрементность делает ширину и длину всегда одинаковой С уважением, Naf Ерунда это. проблема далеко не надумана. есть постулат ооп: для описания подкласса берешь класс добавляешь к нему новые свойства и получаешь подкласс, то есть то, что нужно. а этот пример - разрушает идиллию. Чтобы она стала надуманной надо выдать рекомендацию (формулу, алгорим) с определением сферы применения постулата -- в этих границах применять, в этих не применять. Или показать, что случай прямоугольников - квадратов единственный, и другого нет. Или показать, что множество случаем применения постулата существенно больше множества случаев, где постулат не применим. Например, применим в несчетном числе случаев, а не применим в конечном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 22:01:57 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingizИли показать, что множество случаем применения постулата существенно больше множества случаев, где постулат не применим. Например, применим в несчетном числе случаев, а не применим в конечном.ух ты! ниасилил, если честно )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 22:08:21 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNМеня убил пример, когда круг наследовался от точки, точка от координат. И потом в массиве точек могли хранится круги. Ведь круг только внес понятие радиуса и переопределил метод отрисовки. Но логически наследование бредовое, хоть круг работает как точка.как раз этот пример и показывает, что термин "работает как", а вернее, термин "используется как" подходит для объяснения открытого наследования более подходящий, чем "является". круг, в обычном понимании, естественно точкой не является, однако в конкретной программе использовался так же, как и точка. )) имхо. на самом деле терминологический спор не очень интересен, в конце концов, это дело вкуса, главное правильное понимание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 22:14:46 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingizпочему целые числа нельзя наследовать из рациональных? целые не замкнуты относительно деления. 1.0 / 2.0 вырабатывает результат отличный от 1/2 что нарушает lsp Та формулировка, которую я прочитал в википедии ( Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where S is a subtype of T. ), по-моему, вовсе не противоречит наследованию целых от рациональных... q(x) = { x/a принадлежит T для любого a<>0 принадлежащего T } да, оно верно так же и для всех целых чисел (S)... не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 22:14:58 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
классическую производную не берут от какой попало функции. Чтобы брать производную - надо взять непрерывную функцию. То есть задали множество случаев применения операции взятия производной (функция называется непрерывное если она непрерывна в каждой точке. Функция непрерывна в точке, если бла бла бла). И задали множество случаев не применения операции взятия производной. для применения операции наследования надо сказать, что наследование не применимо когда попало (что показывает контпример с квадратами и треугольниками), а применимо в таком множестве случаев. Вот lsp пытается множество случаев применения наследования задать. Мне кажется, то, что Лисков пыталась выродить называет замкнутость множества относительно применения всех операция. Любая функция получающая аргумент из множества должна вырабатывать результат из того, же множества. целые числа не замкнуты относительно деления, и замкнуты относительно сложения, отнимания и умножения. С тремя операциями класс целых можно наследовать от класса рациональных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 22:21:03 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingizSQL_Lamertchingiz, Вот все ты с этими прямоугольниками успокоиться не можешь :) я пропустил осмысленный ответ? )))))) Ты же знаешь, его не было :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 22:47:39 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
2 tchingiz tchingiz почему целые числа нельзя наследовать из рациональных? Комплексы, кватернионы и октавы сохраняют преемственность четырёх мат. операций, и вполне могут быть наследованы от некого типа мат. вектора. Другое дело, что атомарные типы, такие как int и double вообще "выпадают" из мира наследования как "объекты изучения". Атомы слишком малы, чтобы "городить" вокруг них врапперы. 2 Все Еще раз напоминаю, что без привязки к предметной области, наша дискуссия будет просто философствованием. Будет-ли квадрат наследником прямоугольника или нет - это определит сама прирада задачи. Быть может в какой-нибудь геометрии Лобачевского-Римана или Егорыча-Чингиза существует "точка" с "ненулевой массой" или квадрат с отрицательной площадью. Всё будет иметь своё место и смысл!! Но..... как только мы ОПРЕДЕЛИМСЯ с этой природой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 22:52:18 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingizМне кажется, то, что Лисков пыталась выродить называет замкнутость множества относительно применения всех операция. Любая функция получающая аргумент из множества должна вырабатывать результат из того, же множества. целые числа не замкнуты относительно деления, и замкнуты относительно сложения, отнимания и умножения. С тремя операциями класс целых можно наследовать от класса рациональных Так ведь формулировка википедии этого не подразумевает... Утверждение о замкнутости - это предикат для всего множества, а не для его элементов, к тому же уже накладывающий ограничения на предметную область (операции? кто сказал что они вообще должны быть? есть объект, у него есть поведение , а вся алгебра может быть спокойно проигнорирована в ООП). Или та формулировка не точна? Какой пользуетесь вы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:15:16 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s ptchingizпочему целые числа нельзя наследовать из рациональных? целые не замкнуты относительно деления. 1.0 / 2.0 вырабатывает результат отличный от 1/2 что нарушает lsp Та формулировка, которую я прочитал в википедии ( Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where S is a subtype of T. ), по-моему, вовсе не противоречит наследованию целых от рациональных... q(x) = { x/a принадлежит T для любого a<>0 принадлежащего T } да, оно верно так же и для всех целых чисел (S)... не? автор Liskov Substitution Principle (LSP) If for each object o1 of type S there is another object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2, then S is a subtype of T. берем обьект o1 1 из целых (S) для него существует обьект o2 1.0 из типа рациональных (T) берем программу деления на 2 - P заменяем тип T на S : тоесть получаем программу Pштрих : S -> S результат программы Pштрих(o1) неопределен, результат программы P(o2) = 0.5 поведение изменено. Налицо нарушение принципа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:24:32 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNМеня убил пример, когда круг наследовался от точки, точка от координат. И потом в массиве точек могли хранится круги. Ведь круг только внес понятие радиуса и переопределил метод отрисовки. Но логически наследование бредовое, хоть круг работает как точка.как раз этот пример и показывает, что термин "работает как", а вернее, термин "используется как" подходит для объяснения открытого наследования более подходящий, чем "является". круг, в обычном понимании, естественно точкой не является, однако в конкретной программе использовался так же, как и точка. )) имхо. на самом деле терминологический спор не очень интересен, в конце концов, это дело вкуса, главное правильное понимание Программы должны быть написаны так, чтобы их могли читать люди, и только иногда так, чтобы их могли выполнять машины.(c) (Абельсон и Сассман) если обьявлен массив точек, какго там могут храниться другие фигуры? и второе, еще больше меня поразило то что точка наследует координаты а не содержит. С таким же успехом можно наследовать машину от колеса. а вывод тут может быть один. все решать по обстановке, но пытаться чтобы наследование происходило по принципу "является", хотя джавовское extends - несет другую нагрузку :)(именно расширение а не наследование) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:25:07 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingizNafСтупор философский... Стандартное понимание: наследование новых типов это описание более частных случаев с более конкретной спецификой. Например Животное может передвигаться(метод) и иметь вес (свойство). Слон как наследуемый от него может тоже самое, унаследовано от него, но при этом передвигаться по-своему(полиморфизм) и иметь дополнительно длину хобота и размер копыт (свойства). Все привычно, более частное можно описать более подробно со своей спецификой. Теперь возьмем прямоугольник. Он имеет ширину и длину (2 свойства), методы Сдвинуть, Повернуть. Его частный случай квадрат, но... что толку от его наследования? все описано уже в прямоугольнике. Вся специфика в уменьшении свойств длина и ширина до одного. Так это наследование или нет? С уважением, Naf теоритечески - наследование, так как квадраты - подмножество прямоугольников. к сообщению приложена статья, с примером, что наследование квадратов из прямоугольников нарушает достаточно очевидный принцип Барбары Лисков Liskov Substitution Principle (LSP) http://okmij.org/ftp/Computation/Subtyping/References.html и поэтому не может считаться наследованием. ))) Такчто не все в порядке в датском королевстве, как кажется на первый взгляд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:25:09 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
tchingiz авторwhen o1 is substituted for o2 заменяем тип T на S : тоесть получаем программу Pштрих : S -> S Все равно не понимаю. В принципе говорится о замене объектов, а не замене классов, разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:27:17 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
mayton 2 tchingiz tchingiz почему целые числа нельзя наследовать из рациональных? Комплексы, кватернионы и октавы сохраняют преемственность четырёх мат. операций, и вполне могут быть наследованы от некого типа мат. вектора. Другое дело, что атомарные типы, такие как int и double вообще "выпадают" из мира наследования как "объекты изучения". Атомы слишком малы, чтобы "городить" вокруг них врапперы. . это не атомы - это примеры неприменимости. Дети, функция дирихле слишком редкий случай, что бы сомневаться во взятии производной, нафиг. Давайте обсуждать функцию косинус. пысы четоприпоминается, что всюду разрывных функций больше чем непрерывных. если попалось два примера (квадраты - прямоугольники, целые-рациональные) которые не вмещаются в теорию, это повод понять размеры множеств применимости или не применимости теории, а не отмахиваться от "слишком малых атомов" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:31:33 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
l s p не понимаюtchingiz авторwhen o1 is substituted for o2 заменяем тип T на S : тоесть получаем программу Pштрих : S -> S Все равно не понимаю. В принципе говорится о замене объектов, а не замене классов, разве нет? я тоже пример с квадратами- прямоугольниками рассматриваю уже год это и не понимаю. давай так. деление явно должно быть перегружено берем программу Код: plaintext 1. 2. 3. 4. 5. при подстановке o1, целой единицы вызовется целое деление - результат будет 0. при подстановке плавающей единицы результат будет 0.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:38:41 |
|
||
|
Наследование(ООП). растолкуйте
|
|||
|---|---|---|---|
|
#18+
в смысле, подстановке в коде Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2009, 23:41:20 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35959586&tid=1344470]: |
0ms |
get settings: |
8ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
167ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 452ms |

| 0 / 0 |
