powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Наследование(ООП). растолкуйте
120 сообщений из 120, показаны все 5 страниц
Наследование(ООП). растолкуйте
    #35957494
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ступор философский...
Стандартное понимание: наследование новых типов это описание более частных случаев с более конкретной спецификой. Например Животное может передвигаться(метод) и иметь вес (свойство). Слон как наследуемый от него может тоже самое, унаследовано от него, но при этом передвигаться по-своему(полиморфизм) и иметь дополнительно длину хобота и размер копыт (свойства). Все привычно, более частное можно описать более подробно со своей спецификой.
Теперь возьмем прямоугольник. Он имеет ширину и длину (2 свойства), методы Сдвинуть, Повернуть. Его частный случай квадрат, но... что толку от его наследования? все описано уже в прямоугольнике. Вся специфика в уменьшении свойств длина и ширина до одного. Так это наследование или нет?

С уважением, Naf
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957504
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что здесь затрагивается некая интегральная характеристика (соотношение между свойствами, может быть очень простое - как у квадрата, а может и очень сложное). Эти вещи вообще к ООП никакого отношение не имеют - на мой ламерский взгляд.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957508
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понимаю:
квадрат таки наследуется от прямоугольника, но инкрементность делает ширину и длину всегда одинаковой
С уважением, Naf
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957519
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+
Я не сторонник ООП, но как я понял из ebooks, вся концепция ООП подразумевает
1. Сохранение свойств у новых объектов
2. Добавление и модификация новых.
И нигде не говорится о взимоотношениях между ними - понятия просто такого нет. Вывод напрашивается такой (а точнее подтверждается моё скептическое отношение к ООП) - не всё программирование сошлось клином на нём, не следует всё и вся рассматривать через призму ООП.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957524
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nafя так понимаю:
квадрат таки наследуется от прямоугольника, но инкрементность делает ширину и длину всегда одинаковой
С уважением, Naf
В чем наследование заключается? И что такое инкрементность?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957539
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NafСтупор философский...
Стандартное понимание: наследование новых типов это описание более частных случаев с более конкретной спецификой. Например Животное может передвигаться(метод) и иметь вес (свойство). Слон как наследуемый от него может тоже самое, унаследовано от него, но при этом передвигаться по-своему(полиморфизм) и иметь дополнительно длину хобота и размер копыт (свойства). Все привычно, более частное можно описать более подробно со своей спецификой.
Теперь возьмем прямоугольник. Он имеет ширину и длину (2 свойства), методы Сдвинуть, Повернуть. Его частный случай квадрат, но... что толку от его наследования? все описано уже в прямоугольнике. Вся специфика в уменьшении свойств длина и ширина до одного. Так это наследование или нет?

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

к сообщению приложена статья, с примером, что наследование квадратов из прямоугольников
нарушает достаточно очевидный принцип Барбары Лисков
Liskov Substitution Principle (LSP)

http://okmij.org/ftp/Computation/Subtyping/References.html

и поэтому не может считаться наследованием.
)))
Такчто не все в порядке в датском королевстве, как кажется на первый взгляд.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957545
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но попытаюсь всё-таки в сторону ООП посмотреть, чтобы не превращать философское осмысление понятий в банальный спор противников и сторонников ООП:
Как можно связать квадрат и прямоугольник при помощи поняий ООП?
Я так полагаю, что надо с квадрата начинать - свойство "размер". Затем прямоугольник наследует квадрат - добавлятеся свойство "разница между длинами сторон (a-b)". Тут вроде бы идет наследование от квадрата к прямоугольнику - пусть гуру ООП меня покритикуют.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957553
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class Rect
{
private:  
  float x,y;
public:
  float getX()  {return x}; 
  float getY()  {return y}; 
  virtual void setX(const float ax) {x=ax}; 
  virtual void setY(const float ay) {y=ay};
  float area() {return x*y}; 
  float perimeter() {return  2 *(x+y)}; 
};
class Square: public Rect
{
public:
  virtual void setX(const float ax) {x=y=ax}; 
  virtual void setY(const float ay) {y=x=ay};
};
С уважением, Naf
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957556
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naf wrote:
Слон как наследуемый от
> него может тоже самое, унаследовано от него, но при этом передвигаться
> по-своему(полиморфизм) и иметь дополнительно длину хобота и размер копыт
> (свойства).

Копыта у слона -- это 5 !

> Теперь возьмем прямоугольник. Он имеет ширину и длину (2 свойства),
> методы Сдвинуть, Повернуть. Его частный случай квадрат, но... что толку
> от его наследования? все описано уже в прямоугольнике.

Если нет ни новых свойств, ни нового поведения, то действительно наследовать
не имеет смысла. Но можно - это ничему не помешает, кроме наличия лишнего
класса.

Вся специфика в
> уменьшении свойств длина и ширина до одного. Так это наследование или нет?

Нет, специфика в равенстве длины и ширины. Можно наследоваться. Ничего плохого
не будет. Но можно и просто добавить метод-свойство isSquare() и успокоиться.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957557
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VowkНо попытаюсь всё-таки в сторону ООП посмотреть, чтобы не превращать философское осмысление понятий в банальный спор противников и сторонников ООП:
Как можно связать квадрат и прямоугольник при помощи поняий ООП?
Я так полагаю, что надо с квадрата начинать - свойство "размер". Затем прямоугольник наследует квадрат - добавлятеся свойство "разница между длинами сторон (a-b)". Тут вроде бы идет наследование от квадрата к прямоугольнику - пусть гуру ООП меня покритикуют.
только по-моему прощу у прямоуголника многие понятия определить как площадь и ипериметр, чем потом переопределять
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957561
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одинаковость свойств не означает "исчезновение" одного из них.

Рассмотрим пример: есть классы Фигуры, и некая процедура определяет пролезаемость фигуры через ворота. Хоть для прямоугольника, хоть для квадрата - она будет сравнивать высоту ворот с высотой фигуры, и ширину ворот с шириной фигуры. И ей наплевать, что у квадрата высота с шириной совпадут - для нее это разные свойства, никак не взаимозаменяемые (конечно, если она не умеет вертеть фигуры).

Так что то, что у квадрата одинаковая ширина и высота - это его внутреннее дело, которое может выражаться, как уже было сказано, в синхронной подстройке одного при изменении другого.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957567
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherОдинаковость свойств не означает "исчезновение" одного из них.

Рассмотрим пример: есть классы Фигуры, и некая процедура определяет пролезаемость фигуры через ворота. Хоть для прямоугольника, хоть для квадрата - она будет сравнивать высоту ворот с высотой фигуры, и ширину ворот с шириной фигуры. И ей наплевать, что у квадрата высота с шириной совпадут - для нее это разные свойства, никак не взаимозаменяемые (конечно, если она не умеет вертеть фигуры).

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

и я про тоже

представьте, что вы описываете систему в которой объекты граждане имеют два свойства адрес прописки и текущего проживания, но есть "индейцы", которые должно всегда совмещать эти 2 понятия, как вы их опишете в ООП?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957636
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NafПовернуть. Его частный случай квадрат, но... что толку от его наследования? все описано уже в прямоугольнике.
Квадрат имеет новое св-во - длина стороны, так что наследование
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957727
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tchingizнаследование квадратов из прямоугольников
нарушает достаточно очевидный принцип Барбары Лисков
Liskov Substitution Principle (LSP)
и поэтому не может считаться наследованием.
Это не проблема - достаточно переопределить ненужные методы в NULL и все будет нормально
tchingizТакчто не все в порядке в датском королевстве, как кажется на первый взгляд.
Это да, но про другим причинам
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957739
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотелось бы увидеть что-то более готовое
С уважением, Naf
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35957841
Alexsalog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите мне пожалуйста, если базовый тип Млекопитающее, у которого есть свойства Лапы, то когда я образую Лощадь от этого типа, я могу Лапы переименовать в копыта?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35958100
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexsalogСкажите мне пожалуйста, если базовый тип Млекопитающее, у которого есть свойства Лапы, то когда я образую Лощадь от этого типа, я могу Лапы переименовать в копыта?
- да, для этого существует "полиморфизм" :)
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35958188
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нравится такое толкование полиморфизма
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35958741
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Если нет ни новых свойств, ни нового поведения, то действительно наследовать
не имеет смысла. Но можно - это ничему не помешает, кроме наличия лишнего
класса.

Нет, специфика в равенстве длины и ширины. Можно наследоваться. Ничего плохого
не будет. Но можно и просто добавить метод-свойство isSquare() и успокоиться.


Смысл может быть в случае множественного наследования или реализации интерфейсов.
Например есть интерфейс - правильный многоугольник. Класс квадрат может наследовать класс прямоугольник и реализовть необходимые методы для правильного многоугольника(размер стороны и количество вершин). как тут поможет метод isSquare()?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35958855
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nafя так понимаю:
квадрат таки наследуется от прямоугольника, но инкрементность делает ширину и длину всегда одинаковой
С уважением, Naf

Ерунда это. С математическим подходом, можно расматривать "точку", как вырожденный прямоугольник с длиной и шириной равной 0. Также можно взять N-угольник и аппроксимировать им окружность. Но будет ли вам от такого уровня абстракций хорошо? Надо сосредоточиться не на природе происхождения геометрических фигур. А на операциях, которые мы будем с ними делать.

Если-бы я делал векторный редактор, то выделил-бы несколько базовых классов типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
AbtractShape
 + PrimitiveShape
 |      + Rectangle
 |      + Circle
 + CompoundShape
       + Polygon
       + Text

И эта структура классов будет всего-лишь ИМХОМ. Её можно видоизменять, подстраивая под конкретные задачи.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35958945
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

про то что проблема надумана я согласен, но суть обсуждения - является ли класс квадрат производным от прямоугольника и как это решается. Про ты хорошо заметил согласен, найти этому применение трудно так же как и для квадрата.
Но в твоей иерархии классов я не нашел решения данной проблемы.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35958951
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNПро ты хорошо заметил
тут я пропустил слово "точку"
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35958957
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,

Вот все ты с этими прямоугольниками успокоиться не можешь :)
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35958970
PC_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наследник "Квадрат" существует для "своих" случаев. Например существуют алгоритмы которые на вход могут принять квадрат но не могут принять прямоугольник.

Более интересный в этом плане случай с Прямоугольным треугольником.
В геометрии четко разделяются формулы для подсчета в прямоугольном треугольники и не прямоугольном. В прямоугольном формулы значительно проще. Следовательно удобней сделать два класса.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959069
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNНо в твоей иерархии классов я не нашел решения данной проблемы.
Забей на квадрат. В моей структуре это будет один из конструкторов Rectangle. Если тебе нужно какое-то особое аналитическое свойство, типа возможности нарисовать внутри Rectangle вписанную окружность, то можно ввести метод типа isCircleInside. Разумеется, свойство надо вынести на уровень PrimitiveShape.

И опять-же... эти рассуджения будут справедливы только для "моей точки зрения" на разрабатываемую систему.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959121
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
я уже упоминал про полиморфизм(работу с квадратом как с правильным многоугольником) как это связуеться с методами проверки и конструкторами?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959187
PC_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmayton,
я уже упоминал про полиморфизм(работу с квадратом как с правильным многоугольником) как это связуеться с методами проверки и конструкторами?

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

Суть же ООП, это не слепить все в одну универсальную модель. А как раз крассиво разнести все по полочкам учитывая контекст использования абстракций.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959274
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmayton,
я уже упоминал про полиморфизм(работу с квадратом как с правильным многоугольником) как это связуеться с методами проверки и конструкторами?
Господи... да забудь-же ты про квадрат
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959371
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
математически, или геометрически, квадрат является частным случаем прямоугольника ( и, кстати, ромба, о чём торжественно забыли ), а вот с точки зрения программирования, вообще-то, не всегда. Как раз попалась мне одна книжица, процитирую, пожалуй, корифеев:
Саттер & Александреску "Стандарты программирования на С++"
Рассмотрим 2 класса - Square ( квадрат ) и Rectangle ( прямоугольник ), каждый из которых имеет виртуальные функции для установки их высоты и ширины. Тогда Square не может быть корректно унаследован от Rectangle, поскольку код, использующий видоизменяемый Recatangle, будет полагать, что функция SetWidth не изменяет его высоту ( независимо от того, документирован ли данный контракт классом Rectangle явно или нет ), в то время как функция Square::SetWidth не может одновременно выполнить этот контракт и свой инвариант "квадратности". Но и класс Rectangle не может корректно наследовать классу Square, если его клиенты Square полагают, например, что для вычисления его площади надо возвести в квадрат ширину, либо используют какое-то иное свойство, которое выполняется для квадрата и не выполняется для прямоугольника.
Описание "является" для открытого наследования оказывается неверно понятым при использовании аналогий из реального мира: квадрат "является" прямоугольником в математическом смысле, но с точки зрения поведения Square не является Rectangle. Вот почему вместо "является" мы предпочитаем говорить "работает как" ( или "используется как" ) для того, чтобы такое описание воспринималось максимально правильно
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959414
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

Это многое объясняет, но все же, ИМХО предпочтительнее использовать понятие «является» а не «работает как» в плане того же полиморфизма.
Меня убил пример, когда круг наследовался от точки, точка от координат. И потом в массиве точек могли хранится круги. Ведь круг только внес понятие радиуса и переопределил метод отрисовки.
Но логически наследование бредовое, хоть круг работает как точка.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959420
belugin4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прямоугольник должен быть immutable
или
должна быть возможость у кокретого обхекта сменить класс
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959429
belugin4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959564
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_мод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
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959568
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_Lamertchingiz,

Вот все ты с этими прямоугольниками успокоиться не можешь :)
я пропустил осмысленный ответ?
))))))
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959579
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonNafя так понимаю:
квадрат таки наследуется от прямоугольника, но инкрементность делает ширину и длину всегда одинаковой
С уважением, Naf

Ерунда это.
проблема далеко не надумана.

есть постулат ооп: для описания подкласса берешь класс добавляешь к нему новые свойства и получаешь подкласс, то есть то, что нужно.
а этот пример - разрушает идиллию.
Чтобы она стала надуманной надо выдать рекомендацию (формулу, алгорим)
с определением сферы применения постулата -- в этих границах применять, в этих не применять.

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

Или показать, что множество случаем применения постулата существенно больше множества
случаев, где постулат не применим. Например, применим в несчетном числе случаев, а не применим
в конечном.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959584
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizИли показать, что множество случаем применения постулата существенно больше множества
случаев, где постулат не применим. Например, применим в несчетном числе случаев, а не применим
в конечном.ух ты! ниасилил, если честно ))
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959586
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNМеня убил пример, когда круг наследовался от точки, точка от координат. И потом в массиве точек могли хранится круги. Ведь круг только внес понятие радиуса и переопределил метод отрисовки.
Но логически наследование бредовое, хоть круг работает как точка.как раз этот пример и показывает, что термин "работает как", а вернее, термин "используется как" подходит для объяснения открытого наследования более подходящий, чем "является". круг, в обычном понимании, естественно точкой не является, однако в конкретной программе использовался так же, как и точка. )) имхо.
на самом деле терминологический спор не очень интересен, в конце концов, это дело вкуса, главное правильное понимание
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959587
l s p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)...
не?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959594
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
классическую производную не берут от какой попало функции.
Чтобы брать производную - надо взять непрерывную функцию. То есть задали множество случаев
применения операции взятия производной (функция называется непрерывное если она непрерывна в каждой точке. Функция непрерывна в точке, если бла бла бла). И задали множество случаев не применения операции взятия производной.

для применения операции наследования надо сказать, что наследование не применимо когда попало
(что показывает контпример с квадратами и треугольниками), а применимо в таком множестве случаев.
Вот lsp пытается множество случаев применения наследования задать.
Мне кажется, то, что Лисков пыталась выродить называет замкнутость множества относительно
применения всех операция. Любая функция получающая аргумент из множества должна вырабатывать
результат из того, же множества.
целые числа не замкнуты относительно деления, и замкнуты относительно сложения, отнимания и умножения.
С тремя операциями класс целых можно наследовать от класса рациональных
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959625
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizSQL_Lamertchingiz,

Вот все ты с этими прямоугольниками успокоиться не можешь :)
я пропустил осмысленный ответ?
))))))

Ты же знаешь, его не было :)
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959631
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 tchingiz
tchingiz
почему целые числа нельзя наследовать из рациональных?

Комплексы, кватернионы и октавы сохраняют преемственность четырёх мат. операций, и вполне могут быть наследованы от некого типа мат. вектора. Другое дело, что атомарные типы, такие как int и double вообще "выпадают" из мира наследования как "объекты изучения".

Атомы слишком малы, чтобы "городить" вокруг них врапперы.

2 Все

Еще раз напоминаю, что без привязки к предметной области, наша дискуссия будет просто философствованием. Будет-ли квадрат наследником прямоугольника или нет - это определит сама прирада задачи. Быть может в какой-нибудь геометрии Лобачевского-Римана или Егорыча-Чингиза существует "точка" с "ненулевой массой" или квадрат с отрицательной площадью. Всё будет иметь своё место и смысл!! Но..... как только мы ОПРЕДЕЛИМСЯ с этой природой.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959651
tchingizМне кажется, то, что Лисков пыталась выродить называет замкнутость множества относительно применения всех операция. Любая функция получающая аргумент из множества должна вырабатывать результат из того, же множества. целые числа не замкнуты относительно деления, и замкнуты относительно сложения, отнимания и умножения.
С тремя операциями класс целых можно наследовать от класса рациональных
Так ведь формулировка википедии этого не подразумевает... Утверждение о замкнутости - это предикат для всего множества, а не для его элементов, к тому же уже накладывающий ограничения на предметную область (операции? кто сказал что они вообще должны быть? есть объект, у него есть поведение , а вся алгебра может быть спокойно проигнорирована в ООП). Или та формулировка не точна? Какой пользуетесь вы?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959655
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

поведение изменено. Налицо нарушение принципа
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959656
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNМеня убил пример, когда круг наследовался от точки, точка от координат. И потом в массиве точек могли хранится круги. Ведь круг только внес понятие радиуса и переопределил метод отрисовки.
Но логически наследование бредовое, хоть круг работает как точка.как раз этот пример и показывает, что термин "работает как", а вернее, термин "используется как" подходит для объяснения открытого наследования более подходящий, чем "является". круг, в обычном понимании, естественно точкой не является, однако в конкретной программе использовался так же, как и точка. )) имхо.
на самом деле терминологический спор не очень интересен, в конце концов, это дело вкуса, главное правильное понимание

Программы должны быть написаны так, чтобы их могли читать люди, и только иногда так, чтобы их могли выполнять машины.(c) (Абельсон и Сассман)

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

а вывод тут может быть один. все решать по обстановке, но пытаться чтобы наследование происходило по принципу "является", хотя джавовское extends - несет другую нагрузку :)(именно расширение а не наследование)
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959657
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizNafСтупор философский...
Стандартное понимание: наследование новых типов это описание более частных случаев с более конкретной спецификой. Например Животное может передвигаться(метод) и иметь вес (свойство). Слон как наследуемый от него может тоже самое, унаследовано от него, но при этом передвигаться по-своему(полиморфизм) и иметь дополнительно длину хобота и размер копыт (свойства). Все привычно, более частное можно описать более подробно со своей спецификой.
Теперь возьмем прямоугольник. Он имеет ширину и длину (2 свойства), методы Сдвинуть, Повернуть. Его частный случай квадрат, но... что толку от его наследования? все описано уже в прямоугольнике. Вся специфика в уменьшении свойств длина и ширина до одного. Так это наследование или нет?

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

к сообщению приложена статья, с примером, что наследование квадратов из прямоугольников
нарушает достаточно очевидный принцип Барбары Лисков
Liskov Substitution Principle (LSP)

http://okmij.org/ftp/Computation/Subtyping/References.html

и поэтому не может считаться наследованием.
)))
Такчто не все в порядке в датском королевстве, как кажется на первый взгляд.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959659
tchingiz
авторwhen o1 is substituted for o2
заменяем тип T на S : тоесть получаем программу Pштрих : S -> S

Все равно не понимаю. В принципе говорится о замене объектов, а не замене классов, разве нет?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959662
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton 2 tchingiz
tchingiz
почему целые числа нельзя наследовать из рациональных?

Комплексы, кватернионы и октавы сохраняют преемственность четырёх мат. операций, и вполне могут быть наследованы от некого типа мат. вектора. Другое дело, что атомарные типы, такие как int и double вообще "выпадают" из мира наследования как "объекты изучения".

Атомы слишком малы, чтобы "городить" вокруг них врапперы.
.

это не атомы - это примеры неприменимости.

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

пысы
четоприпоминается, что всюду разрывных функций больше чем непрерывных.
если попалось два примера (квадраты - прямоугольники, целые-рациональные) которые не вмещаются
в теорию, это повод понять размеры множеств применимости или не применимости теории,
а не отмахиваться от "слишком малых атомов"
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959664
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l s p не понимаюtchingiz
авторwhen o1 is substituted for o2
заменяем тип T на S : тоесть получаем программу Pштрих : S -> S

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

Код: plaintext
1.
2.
3.
4.
5.
int P ( float x) 
{
return x/ 2 
}


при подстановке o1, целой единицы вызовется целое деление - результат будет 0.
при подстановке плавающей единицы результат будет 0.5
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959667
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в смысле, подстановке в коде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int P ( const int o1= 1 ) 
{
return o1/ 2 
}



Код: plaintext
1.
2.
3.
4.
5.
6.
int P ( const float o2 =  1 . 0 ) 
{
return o2/ 2 
}


?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959670
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в программу должен вставляться обьект о1 и, значит, должна вызываться операция деления целых
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959677
tchingizя тоже пример с квадратами- прямоугольниками рассматриваю уже год это и не понимаю.
Я все больше склоняюсь к мысли, что заменять T на S и требовать неизменности поведения любой программы бессмысленно. Что делать с программой, которая вообще объекты не использует, а тупо выводит на экран название используемого класса (типа)? Ее поведение изменится в любом случае, так что можно придти к выводу, что в природе не существует "подтипов" вообще... Это неконструктивно))

tchingizдавай так.
деление явно должно быть перегружено
берем программу
Код: plaintext
1.
2.
3.
int P ( float x) 
{
return x/ 2 
}
при подстановке o1, целой единицы вызовется целое деление - результат будет 0.
при подстановке плавающей единицы результат будет 0.5
результат будет всегда 0, ведь возвращаемый тип - int.
думаю, вы имели ввиду что-то вроде этого:
Код: plaintext
1.
template<T>
T half(T x) { return x /  2 ; } 
Тогда действительно получается, что замена x с float на int меняет поведение функции для нечетных х. Но мне по-прежнему не очевидно, что этот пример олицетворяет принцип Лисков, поскольку, опять же, в нем нет ни слова про замену классов, только про замену объектов.
Вот возьмем функцию
Код: plaintext
float half(float x) { return x/ 2 ; }
и сделаем всё четко по принципу: T - float, S - int; для любого int'а есть соответствующий float, такой, что если в любой программе использующей эту функцию заменить его на соответстущий int, то поведение программы не изменится; что ж, для с/с++, насколько мне известно, это действительно так, так что int is subtype of float...
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959681
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а почему результат обработки наследника должен совпадать с результатом обработки родителя?
Пример: есть класс форма. От его наследуеться класс форма с кнопкой. Медод вывода на экран даст разные результаты. А что, форма с кнопкой не являеться формой?
а про деление нацело - дак это и неправильно. потомучто в природе в общем случае даже деление целых чисел дает действительный результат резльтат, или, при делении на ноль, результат не число.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959690
ZyK_BotaNа почему результат обработки наследника должен совпадать с результатом обработки родителя?
Никто не говорит, что должно. Требование, как я его понимаю, совершенно иное: чтобы для всех возможных экземпляров класса-наследника существовал хотя бы один экземпляр класса-родителя такой, что результат его обработки в любой программе аналогичен.

ZyK_BotaNПример: есть класс форма. От его наследуеться класс форма с кнопкой. Медод вывода на экран даст разные результаты. А что, форма с кнопкой не являеться формой?
Всё здесь в порядке: в классе "форма", разумеется, есть объекты, поведение которых полностью идентично поведению некоторому объекту класса "формы с кнопкой"; по-моему, это очевидно?

ZyK_BotaNа про деление нацело - дак это и неправильно. потомучто в природе в общем случае даже деление целых чисел дает действительный результат резльтат, или, при делении на ноль, результат не число.
Так о том и спич - надо ли требовать, чтобы результат деления был того же типа что и аргументы или нет? Возьмите два рациональных числа, второе из которых не ноль; поделите первое на второе, обязательно получите рациональное число. А вот целые числа таким свойством не обладают. Вот и вопрос: значит ли это, что целые числа не являются подклассом рациональных (как не обладающие свойством, которым обладают рациональные числа) или все-таки является.

Вот еще один довод в пользу того, чтобы не считать обязательным сохранение всех свойств типа (а не объектов типа ): возьмем некоторые тип T и подтип S, пусть существует объект о1, принадлежащий Т и не принадлежащий S, но тогда T обладает тем свойством, что содержит обхект о1, а S таким свойством не обладает, значит S не являеттся подтипом Т, полученное противоречие означает что объекта о1 не существует, или, иными словами, любой подтип совпадает со своим надтипом. Это, опять же, неконструктивно)))
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959692
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton 2 Все

Еще раз напоминаю, что без привязки к предметной области, наша дискуссия будет просто философствованием. Будет-ли квадрат наследником прямоугольника или нет - это определит сама прирада задачи. Быть может в какой-нибудь геометрии Лобачевского-Римана или Егорыча-Чингиза существует "точка" с "ненулевой массой" или квадрат с отрицательной площадью. Всё будет иметь своё место и смысл!! Но..... как только мы ОПРЕДЕЛИМСЯ с этой природой.при привязке к предметной области вопрос переходит в практическую плоскость и сразу становится оффтопиком,
потому как тред начался со слов "философский ступор" ну и потеряет свою остроту и интересность.
Ну а если серьёзно, то я в выделенной цитате не вижу разногласий с моей позицией. Только от задачи зависит, может-ли квадрат наследоваться от прямоугольника, ромба, параллелограмма, круга или точки, или не может.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959703
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l s p не понимаю
Так о том и спич - надо ли требовать, чтобы результат деления был того же типа что и аргументы или нет? Возьмите два рациональных числа, второе из которых не ноль; поделите первое на второе, обязательно получите рациональное число. А вот целые числа таким свойством не обладают. Вот и вопрос: значит ли это, что целые числа не являются подклассом рациональных (как не обладающие свойством, которым обладают рациональные числа) или все-таки является. на мой взгляд ответ однозначный - целые числа не являются подклассом рациональных для случаев, когда операция деления определена. Потому что я, как клиент класса Float, могу совершенно спокойно написать такой код:
Код: plaintext
1.
2.
Float half( Float var ) { return var/ 2 ; }
Float foo( Float *something) { return  1 /half( something ); }
и буду вполне обоснованно надеятся, что передав в функцию foo указатель на Integer : public Float не получу деления на 0... ха!
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959707
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz

Код: plaintext
1.
2.
3.
4.
5.
int P ( float x) 
{
return x/ 2 
}


при подстановке o1, целой единицы вызовется целое деление - результат будет 0.
при подстановке плавающей единицы результат будет 0.5
тут ошибочка естественно
Код: plaintext
1.
2.
3.
4.
5.
float P ( float x) 
{
return x/ 2 
}

...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959708
egorychна мой взгляд ответ однозначный - целые числа не являются подклассом рациональных для случаев, когда операция деления определена. Потому что я, как клиент класса Float, могу совершенно спокойно написать такой код:
Код: plaintext
1.
2.
Float half( Float var ) { return var/ 2 ; }
Float foo( Float *something) { return  1 /half( something ); }
и буду вполне обоснованно надеятся, что передав в функцию foo указатель на Integer : public Float не получу деления на 0... ха!
А что это за язык? Вы, что ли, имеете ввиду различные машинные представления int и float?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959710
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l s p не понимаю
Код: plaintext
float half(float x) { return x/ 2 ; }
и сделаем всё четко по принципу: T - float, S - int; для любого int'а есть соответствующий float, такой, что если в любой программе использующей эту функцию заменить его на соответстущий int, то поведение программы не изменится; что ж, для с/с++, насколько мне известно, это действительно так, так что int is subtype of float...
не согласен.
в теле программы x заменим на 1.

упростим. параметр не нужен

Код: plaintext
float half() { return  1 . 0 / 2 ; }
и
Код: plaintext
float half() { return  1 / 2 ; }

вернут разные результаты
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959712
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l s p не понимаюtchingizя тоже пример с квадратами- прямоугольниками рассматриваю уже год это и не понимаю.
Я все больше склоняюсь к мысли, что заменять T на S и требовать неизменности поведения любой программы бессмысленно. Что делать с программой, которая вообще объекты не использует, а тупо выводит на экран название используемого класса (типа)? Ее поведение изменится в любом случае, так что можно придти к выводу, что в природе не существует "подтипов" вообще... Это неконструктивно))
.
это к Лисков, она у нас получатель премии Тьюринга.
Думаю ее принцип есть следствием отсутствия человеческих определений в ооп,
и желанием понять, что же имеется ввиду.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959714
tchingizне согласен.
в теле программы x заменим на 1.
упростим. параметр не нужен
Код: plaintext
float half() { return  1 . 0 / 2 ; }
и
Код: plaintext
float half() { return  1 / 2 ; }

вернут разные результаты
Так вы не объект заменили, вы программу (функцию) изменили. Вообще, с чего вдруг второй вариант написан "in terms of int", а не "in terms of float"?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959715
tchingizэто к Лисков, она у нас получатель премии Тьюринга.
Думаю ее принцип есть следствием отсутствия человеческих определений в ооп,
и желанием понять, что же имеется ввиду.
Так я все никак не увижу где бы Лисков требовала заменяемости типа родителя на тип наследника.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959717
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
псевдокодом написал, имелось ввиду следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Float {
   ...
};
Float & operator/( const Float & lhs, const Float & rhs ) { ... }

class Integer : public Float {
   ...
};

Float half( Float var ) { ... }
Float foo( Float *something ) { ... }
мы же о наследовании, в общем-то говорим.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959720
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2
l s p не понимаю
и сделаем всё четко по принципу: T - float, S - int; для любого int'а есть соответствующий float, такой, что если в любой программе использующей эту функцию заменить его на соответстущий int, то поведение программы не изменится; что ж, для с/с++, насколько мне известно, это действительно так, так что int is subtype of float...
имхо, это не то, что имеет ввиду Лисков,
так как в любой программе использующей это функцию, не должно сначала выполняться
преобразование типа int в float, так как тогда, на деле передается объект из T.
Склонен считать, что подстановка объектов должна выполнятся в теле функции P
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959721
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,

оператор "/" переопределен для разных типов(int, float) так, что несет разную смысловую нагрузку, поэтому очевидно что при работе с разными типами, получаем разный результат.

а если бы создатели языка действительно наследовали int от float :), то оператор деления нельзя было бы переопределить как деление нацело и в итоге мы бы получали в результате 0.5 даже в случае целого типа

пример с делением не доказал невозможность наследования целых от рациональных
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959722
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

ну и оператор деления для Integer определить с той же семантикой, как у встроенного типа - и всё, привет семье. Неожиданные ошибки времени выполнения в клиентском коде, использующем Integer через указатель на базовый класс ( Float ) обеспечены.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959725
egorychпсевдокодом написал, имелось ввиду следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Float {
   ...
};
Float & operator/( const Float & lhs, const Float & rhs ) { ... }

class Integer : public Float {
   ...
};

Float half( Float var ) { ... }
Float foo( Float *something ) { ... }
мы же о наследовании, в общем-то говорим.
Отлично, и что же вас смущает?
Какой бы Integer в какой угодно программе вы бы ни взяли, вы всегда можете подыскать такой Float, что замена этого Integer'а на этот Float даст полностью аналогичное поведение программы. (например, 1 заменить на 1.0, 2 на 2.0 и т.д.). Функция half при этом совершенно не должна переписываться под тип Integer - замене ведь подлежат только объекты; и возвращать она всегда будет Float, что для Integer'ов, что для Float'ов, и для 1 и для 1.0 возвращать будет одно и то же; по мне так, все шито-крыто))
(в терминах квадратов-прямоугольников: поскольку для любого квадрата всегда можно указать прямоугольник, который ведет себя абсолютно так же (обе стороны которого равны стороне квадрата, очевидно), то, согласно Лисков, квадрат является подтипом прямоугольника)
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959727
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNа если бы создатели языка действительно наследовали int от float :), то оператор деления нельзя было бы переопределить как деление нацело и в итоге мы бы получали в результате 0.5 даже в случае целого типакак это возможно, интересно? Что будет вот здесь:
Код: plaintext
int c = half(  1  ); // чему будет равно значение с? 
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959728
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l s p начинаю пониматьtchingizэто к Лисков, она у нас получатель премии Тьюринга.
Думаю ее принцип есть следствием отсутствия человеческих определений в ооп,
и желанием понять, что же имеется ввиду.
Так я все никак не увижу где бы Лисков требовала заменяемости типа родителя на тип наследника.
тут недопонял
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959729
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.

К чему переопределять-то? Что, операция деления двух целых чисел не такая, как для деления двух рациональных? Чему противоречит то, что результат будет нецелым? Вы же сами себя в рамки замкнутости относительно деления и загоняете, а потом говорите что раз эти рамки есть то наследование невозможно))
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959732
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l s p начинаю понимать
(в терминах квадратов-прямоугольников: поскольку для любого квадрата всегда можно указать прямоугольник, который ведет себя абсолютно так же (обе стороны которого равны стороне квадрата, очевидно), то, согласно Лисков, квадрат является подтипом прямоугольника)до тех пор, пока клиентский код не будет надеяться на то, что изменение высоты прямоугольника не приводит к изменению его ширины.
ЗЫ дежавю )))
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959736
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l s p начинаю пониматьtchingizне согласен.
в теле программы x заменим на 1.
упростим. параметр не нужен
Код: plaintext
float half() { return  1 . 0 / 2 ; }
и
Код: plaintext
float half() { return  1 / 2 ; }

вернут разные результаты
Так вы не объект заменили, вы программу (функцию) изменили. Вообще, с чего вдруг второй вариант написан "in terms of int", а не "in terms of float"?
))
я выполнил substitution, и o1 is substituted for o2,
дале я жду, что бы поведение программы было неизменным.

the behavior of P is unchanged

поскольку поведение программы до субститушион и после отличаются, то \
делаю вывод, что int не есть подтип float/
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959737
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l s p начинаю пониматьК чему переопределять-то? Что, операция деления двух целых чисел не такая, как для деления двух рациональных? Чему противоречит то, что результат будет нецелым? Вы же сами себя в рамки замкнутости относительно деления и загоняете, а потом говорите что раз эти рамки есть то наследование невозможно))ещё раз: чему будет равно значение переменной с в таком случае: int c = half( 1 ); ???
операция деления целых чисел должно возвращать целое число.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959739
egorychдо тех пор, пока клиентский код не будет надеяться на то, что изменение высоты прямоугольника не приводит к изменению его ширины.
ЗЫ дежавю )))
Вы опять про переопределенные методы (сеттеры). Нельзя их использовать, если хотите применять принцип Лисков, вот и вся задача. И это вовсе не значит, что "квадрат с переопределенными сеттерами сторон не является подтипом прямоугольника согласно LSP". Это значит лишь то, что данный вопрос неразрешим при помощи LSP, ни в ту ни в другую сторону.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959747
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychl s p начинаю пониматьК чему переопределять-то? Что, операция деления двух целых чисел не такая, как для деления двух рациональных? Чему противоречит то, что результат будет нецелым? Вы же сами себя в рамки замкнутости относительно деления и загоняете, а потом говорите что раз эти рамки есть то наследование невозможно))ещё раз: чему будет равно значение переменной с в таком случае: int c = half( 1 ); ???
операция деления целых чисел должно возвращать целое число.

с каких это пор? это вы почерпнули из си-подобных языков(дак там результат деления не цлое, вас ввело в заблуждение то что операция деления и деления нацело обозначаеться одним оператором "/")? Например: в пскале при делении целого на целое ответ рациональный, в 3-м питоне тоже деление не цлеочисленное , интересно почему это зделали? :) наврное они незнали что в результат деления целых это целое.
в случае int c = half( 1 ); - необходимо зделать приведение типов. с каких это пор обьект базового класса присваевался ссылке производного?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959751
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 для вещественных? чем она лучше или хуже функции взятия половины числа, а?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959752
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

и какой язык программирование позволит переопределить метод так, чтобы он возвращал обьект другого типа?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959755
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и хто мешает определить для целочисленного типа метод целочисленного деления, как в паскале. Вирт был не дурак, знал что в учебном языке нельзя реализовывать хоть и удобные вещи, но те которые противоречат здравому смыслу.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959757
l s p начинаю пониматьegorychещё раз: чему будет равно значение переменной с в таком случае: int c = half( 1 ); ???
0.5, конечно же.
Прошу прощения, невнимательно прочитал.
half ( 1 ) вернет 0.5.
Чему будет равно с программно определяется конструктором Integer; теоретически этот вопрос смысла не имеет, т.к. LSP требует чтобы изначально программа была определена в терминах Float, так что никаких Integer она содержать не должна.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959758
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l s p начинаю пониматьegorychдо тех пор, пока клиентский код не будет надеяться на то, что изменение высоты прямоугольника не приводит к изменению его ширины.
ЗЫ дежавю )))
Вы опять про переопределенные методы (сеттеры). Нельзя их использовать, если хотите применять принцип Лисков, вот и вся задача.

да. при переопределении метода появляются проблемы..

l s p начинаю понимать И это вовсе не значит, что "квадрат с переопределенными сеттерами сторон не является подтипом прямоугольника согласно LSP". Это значит лишь то, что данный вопрос неразрешим при помощи LSP, ни в ту ни в другую сторону.

про "и это вовсе не означает" другими словами можно?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959761
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
void g (Rectangle & r)
{
 r.SetWidth( 5 );
 r.SetHright ( 4 );
 assert(r.GetWidth() * r.GetHeight()) ==  20 
}


действительно передается разные параметры.

с делением надо сделать, чтобы вызвалось разное деление.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959776
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,

вся фишка в том, что метод переопределяеться на онове разных входных параметров и возвращает резултат одного типа(в данном случае void).
при делении - параметры одного типа(так как инт есть флоат) и возвращеться один тип флоат(так как флоат не есть инт)
это говорит о том что нормальное деление нужно оставить, а целочисленное создать используя новое имя.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959789
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ааааа, дошло.
нефиг. сделайте мне модель предметной области. Точно как в математике. Это техническое задание.
На множестве целых четыре операции
полностью определенные три
сложение, вычитание и умножение - на вход принимают два инта на выходе один.
Частично определенное деление - на вход принимает два инта, на выходе один.
в естественных случаях деление выбрасывает эксепшен (если нет целого).

Тоже с рациональными числами только деление всюду определено,
все операции на вход принимает два рациональных на выходе одно.
И чтобы деление называлось одинаково для обоих классов --- значком слэш.

И чтобы целые наследовались из рациональных.
И не объясняйте, что математика плохая, а мне надо не то, что в тз.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959797
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,
математика хорошая, ты мне скажи какой математик тебе сказал что целое поделить на целое это целое(про то что операции определены на множестве целых, дак это ты сам придумал. тут уже упоминалось про то что метод класса не обязан возвращать результат собственного типа, а скорее наоборот, такие методы довольно редки)
Ты имееш ввиду что создатели многих(не си-подобных) языков придурки, и они неправы в том что реализовали нормальное деление для целых. И в 3-м питоне случайно заменили цел. деление на обычное, что-бы совместимость с 2-й(которая унаследовала деление от си) потерять :) ???
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959820
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я имею ввиду, что на множестве целых чисел операция деления определена не на всем множестве
целые >< целые, а на некоторых парах не определена.
и требуется реализовать именно эту функцию деления, а не какую либо другую.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959822
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о том, как вводится множество целых чисел с операциями сложения, отнимания, умножения и деления
мне рассказал Пеано.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35959987
мнение
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос? Вы определились с задачей?
Как только станет ясна задача и будет определено поведение, отсюда естественным образом получается контракт типа.
Контракт:
1. Может быть таким
2. Может вести себя так
3. Ожидаем таких-то манёвров
3. Предусловие, постусловие, ивариант
4. Прочее

Как только определен контракт, сразу всё станет на свои места. Тип Т исполняет контракт. Тип Р, являясь подтипом Т тоже обязан исполнить контракт, или он не может быть унаследован от Т.
Если тип Р должен иметь дополнительную функциональность (но не измененную!!!), наследуйте котракт, но в этом случае не требуйте, чтобы потребитель первого варианта контракта знал о новых(а не измененных. Менять поведение нельзя) мульках второго контракта.

А вы с примерами разных делений просто переопределяете контракт на ходу и пытаетесь что-то вывести.

С Уважением,
ЗЫ: Очень интересный топик.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35960747
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мнение,
вот реально +500 ))

есть как бы понятие "множество целых чисел". Его контракт известен пользователю класса Integer. Есть понятие "множество рациональных чисел", его контракт известен пользователю класса Float. Контракты практически одинаковы, с одним маленьким различием, касательно операции деления. Если мы хотим отнаследовать Integer от Float, то нам необходимо разрешить противоречие, заключённое в этом маленьком различии. Ибо парадигма объектно-ориентированного программирования нам говорит, что класс-наследник должен полностью выполнять контракт базового класса. В случае целых и рациональных чисел наследуемый класс не может полностью выполнить контракт базового. Вот и всё, о чём ещё говорить?
Кстати, и в питоне и в паскале, хотя разработчики этих языков и были умными людьми, всё одно не сделали int наследником float. Почему бы?
И в конце концов, операция деления целых чисел, возвращающая рациональное число приводит к появлению неоправданного оверхеда на многократное приведение типов. "С" и его наследники с оверхедом борятся, другим языкам на оверхед наплевать, вот отсюда и разница в реализации.

В случае квадрата и прямоугольника - такая же история с невозможностью полного выполнения контракта базового класса. Кстати, а почему, собственно, квадрат наследник прямоугольника? почему не ромба? почему не равнобедренного многоугольника? Совсем неочевидный выбор базового класса.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35961073
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tchingizпочему целые числа нельзя наследовать из рациональных?
Потому что наследник накладывает ограничения на св-ва и методы родителя. То же самое с квадратом - он накладывает ограничение на прямоугольник. В этом случае такие св-ва и методы должны быть переопределены. Наследование в чистом виде работает если нет ограничений, а только добавляются новые св-ва и методы.
На самом деле есть просто разные типы данных, для каждого типа определены свои операции, но могут использоваться "чужие" с возможностью отказа выполняться.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35961500
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а почему в моем варианте не сохраняеться контракт, ведь у мну тип инт наделяеться новым поведением под названим целочисленное деление и остаток от деления, а рациональное деление остаеться таким каки оно и было для рац. чисел.

а про квадрат, я согласен, при изменении одной стороны вторая изменяться не должна(по контракту).
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35961538
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychмнение,
Кстати, и в питоне и в паскале, хотя разработчики этих языков и были умными людьми, всё одно не сделали int наследником float. Почему бы?


Пскаль это процедурный язык, там ООП до Броланда и не пахло, а в создатель питона взял поведение целих и рац чисел с языка СИ.
А главные ограничения на наследования инт от флоат наложила машина. Ведь там уже забиты понятия целых и вещественных
И в языке паскаль - поведение целых и вещественных типов соответсвует наследованию инт от риал
вместо риал подставить целое можно, а наоборот нельзя, при делении целых - ответ вещественный, для целых определены новые методы mov div.
А насчет питона, дак это только в 3-е изменили поведение деления на то каким оно должно быть(не в плане удобства, а в лгики, мне нравиться то что в си деление целочисленное)
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35961565
мнение
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZyK_BotaN,

попробуйте формально записать свой контракт.
Повторяю: определяет контракт. Какое поведение в него заложите, такое и должен исполнять тип. Заложите целые, остатки, пр. (общий случай для целого/вещественного, или может быть еще более общий для комплексных чисел) - и все эти типы (целые, вещественные, комплексные) его реализуют, не вижу противоречия для организации системы типов при помощи механизмов наследования. Если позволяет выбранный язык, если это удобно и полезно в конкретном решении, если... если..., но это уже реализация.

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

Если контракт не накладывает ограничение на возвращаемый тип, а говорит о том, что вернуться должен математический (какой-нибудь из них) результат деления и используемый язык позволяет записать это формально (например python с динамической типизацией), то обратно - нет препятствий для выстраивания иерархии наследования. Нужно ли это - этого вопроса мы не касаемся.

Вот как-то так.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35961676
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мнение,

Я слеп, бьюсь головой об это деление(и тут я уверен что прав ведь логично что контракт деление определяет возвращение вещественного числа). Но как тода быть со сложением, разницой и умноженим. Тогда выйдет что сума целых будет вещественное число что правильно относительно парадигмы ООП, но не удобно при применении. Да каюсь, - также как и квадрат относительно прямоугольника, целое - это часный случай вещественного, а наследование зделать можно но бесмысленно. Здаюсь и в этот топик не возвращаюсь.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35961917
йцуфыв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мнениеКак только определен контракт, сразу всё станет на свои места. Тип Т исполняет контракт. Тип Р, являясь подтипом Т тоже обязан исполнить контракт, или он не может быть унаследован от Т.
egorych+500
...
есть как бы понятие "множество целых чисел". Его контракт известен пользователю класса Integer. Есть понятие "множество рациональных чисел", его контракт известен пользователю класса Float.
Что-то я, видимо, по меньшей мере одного из вас не понял. мнение пишет про один контракт, а egorych уже откуда-то взял два.

egorychВ случае целых и рациональных чисел наследуемый класс не может полностью выполнить контракт базового.
Почему не может-то? Для деления рациональных чисел, он требует, чтобы:
1) второй операнд был отличен от нуля;
2) возвращаемый результат был рациональным числом.
Деления для целых чисел в полной мере удовлетворяет обоим требованиям.
Вот и всё, о чём ещё говорить?

_модПотому что наследник накладывает ограничения на св-ва и методы родителя. То же самое с квадратом - он накладывает ограничение на прямоугольник. В этом случае такие св-ва и методы должны быть переопределены. Наследование в чистом виде работает если нет ограничений, а только добавляются новые св-ва и методы.
Вы можете привести пример наследования, при котором наследник не накладывает ограничения ни на свойства ни на методы родителя, но при этом и не совпадает с ним (т.е. не просто class Child : Parent {})?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35962228
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
йцуфывegorych
есть как бы понятие "множество целых чисел". Его контракт известен пользователю класса Integer. Есть понятие "множество рациональных чисел", его контракт известен пользователю класса Float.
Что-то я, видимо, по меньшей мере одного из вас не понял. мнение пишет про один контракт, а egorych уже откуда-то взял два.ну бог ты мой, про математику забыли, да? егорыч взял оба контракта из математики. когда возникло программирование, было такое странное желание, что типы данных "целое" и "рациональное" в программировании сделать такими-же, как они определены в математике, и знаете что? - такая их реализация оказалась вполне востребованной.
ну да, кстати, лучше уж "вещественное", чем "рациональное", что, правда, смысл не меняет.

йцуфывegorychВ случае целых и рациональных чисел наследуемый класс не может полностью выполнить контракт базового.
Почему не может-то? Для деления рациональных чисел, он требует, чтобы:
1) второй операнд был отличен от нуля;
2) возвращаемый результат был рациональным числом.
Деления для целых чисел в полной мере удовлетворяет обоим требованиям.
Вот и всё, о чём ещё говорить?контракт деления рациональных чисел действительно такой. вот контракт деления у целых - другой. В этом и проблема. При реализации класса целых как наследника рациональных, мы нарушаем контракт деления целых чисел, которое знает и использует очень большое количество людей. Как я понимаю, создатели питона.3 решили на них положить - теперь вот думают, чего делать дальше. Слишком много оказалось надо переписывать. Хотя могу и ошибаться, я с питонами не дружу ))
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35962832
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
йцуфывВы можете привести пример наследования, при котором наследник не накладывает ограничения ни на свойства ни на методы родителя, но при этом и не совпадает с ним (т.е. не просто class Child : Parent {})?
Конечно.
Parent: Документ, св-ва: дата, содержание, метод: поиск по дате или содержанию
Child: Накладная, доп. св-ва - список товаров, методы: поиск по товару
все методы Документ без ограничений обслуживают Накладные, ничего не зная о доп. св-вах и методах
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35963402
мнение
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_модйцуфывВы можете привести пример наследования, при котором наследник не накладывает ограничения ни на свойства ни на методы родителя, но при этом и не совпадает с ним (т.е. не просто class Child : Parent {})?
Конечно.
Parent: Документ, св-ва: дата, содержание, метод: поиск по дате или содержанию
Child: Накладная, доп. св-ва - список товаров, методы: поиск по товару
все методы Документ без ограничений обслуживают Накладные, ничего не зная о доп. св-вах и методах
А теперь вопрос к йцуфыв.
Можете привести обратный пример (обратный к Вашему вопросу).
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35963445
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мнение
Дык float - int, прямоугольник-квадрат ну и т.д
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35964157
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych
ну да, кстати, лучше уж "вещественное", чем "рациональное", что, правда, смысл не меняет.
не лучше, рациональные - это минимальное поле, содержащее целые.
Меньше сущностей меньше места для посторонних разговоров, типа не от того породил,
как с квадратами было
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35964169
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть, будем считать что требуемая реализация целых рациональных с использованием
наследования на с++ трудностей не представляет.
Код может быть написан.

два формальных примера выполненных на с++ с использованием наследования уважаемая публика,
начиная с Лисков, упорно отказывается признавать "правильным" наследованием.
/* если вспомнить определение Страуструпа "класс это пользовательский тип", то обнаружим,
что есть неопределенность в терминах класс и тип. То что есть подтипом по Страуструпу, не есть
подтипом по Лисков*/

а что такое контракт?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35978185
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите как реализовано наследование абстрактных классов чисел в 3-м питоне
http://www.ibm.com/developerworks/ru/library/l-python3-2/
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35978369
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и чё мы там должны были увидеть, интересно? красивые квадратики?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35989527
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появились вот какие соображения. Смысл введения класса "квадрат" будет в том случае, если программист сам решает, что вот резервируем объект, принадлежащий классу "квадрат", а в другом случае - классу "прямоугольник". Тогда квадрат, унаследовав от прямоугольника формулу вычисления площади, вычислит свою площадь правильно - смысл в наследовании есть. А если каким-то другим образом образуется из прямоугольников подмножество квадратов - то тут и возникают проблемы.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35989629
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь есть некрасивый антипаттерн. Если фигуру класса "прямоугольник" схатили мышкой за угол и потянули в сторону, и при этом сделали её квадратом (по размерности). То что делать с её типом? Динамически сменить? Или оставить эдаким равносторонним прямоугольником?

Парадокс.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35989711
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

1.0 - динамически заменить на цлое :)
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35989816
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Динамически сменить.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35989818
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beluginmayton,
Динамически сменить.
Ты-бы такое сделал в своём проекте?
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35989820
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belugin,

зачем?
если обьект - прямоугольнит, значит это кому нибудь нужно, и равенство сторон допускаеться

гляьнь мой пример выше
если вещественное число без дробной части, оно динамически не приводиться к целому. тут ситуация аналогичная
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35989961
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

я к сожалению, не писал на языке который такое допускает, если бы работал на cecil был бы опыт, я думаю.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35989964
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,
ну я рассматриваю пример как искусственный - так как с квадратом не связано какой-то мегалогики которую плохо держит прямоугольник. Если бы я работал на языке поддерживающе динамическую классификацию и задача подразумевала вестма специфическуб логику в "квадрате", то такое, наверное, было бы удобно.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35989999
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаком с cecil, но насколько позволяют судить мои знания в области ООП, смена типа (конструирование нового объекта) на ходу - операция имеющая большие трудозатраты и со стороны разработчика и со стороны исполняющей среды. Гораздо проще на мой взгляд расширить прямоугольник функционалом равностороннего прямоугольника.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35990037
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
я не думаю что на cecil для программиста это будет сильно затратно

Думаю, будет типа того:

Код: plaintext
1.
2.
3.
4.
5.
6.
object rectange;
	method area(b@buffer) { b.width * b.height }

predicate square isa rectange when rectange.width = rectange.height;
	method area(b@buffer) { b.width ^  2  }

...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35990048
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belugin,

а множественное наследование? есле даный обьект нужно передавать в методы которые обрабатуют правильные треугольники
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35990062
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тьфу. конечно же многоугольники
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35990100
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,

почитайте пример с буфером по ссылке - там как раз множественное наследование есть.

Так как я не в курсе как это дальше передавать, я думаю, можно было бы привести прямоугольник к правильному и в таком виде передать методу.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35990141
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belugin,

как привести? создать новый обьект?. а если метод должен изменить обьек переданый по ссылке?можно реализовать почти все любыми средствами(ели язык полный по тюрингу), но создания обходных путей в данном случае не вижу.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35990242
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,

Так же как вы передавете указатель на переменную типа object в метод, который работает с Button.

Если у вас где-то написано что ПравильныйМногоугольник isA МногоУгольник where всеСтороныРавны and всеУглыРавны

То многоугольник автоматически становится равносторонним, когда у него все углы равны и подменяются реализации методов.

Если он его изменит в рантайме то он может перестать быть правильным многоугольником. И что?

Вон в js вообще можно добавлять и сносить методы по ходу дела и ничего - живут.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35990853
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beluginВон в js вообще можно добавлять и сносить методы по ходу дела и ничего - живут.
Поэтому, наверное и крупные проекты на js никто не пишет.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35992833
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, мне кажется, на js их не пишут из-за того, что нет окружения нормального ни для чего кроме бьраузеров. А на смолтоке, наколько я знаю, IBM много чего крупного в свое время писало.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35992845
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эээ... ну, насколько я помню в Windows для административных скриптовых задач используется VB. Но в принципе, можно и скриптовать через JS. Поэтому не вижу особых трудностей.
...
Рейтинг: 0 / 0
Наследование(ООП). растолкуйте
    #35992890
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
ну там кот наплакал окружения. Сравните с питоном, на котором ERP даже пишут.
...
Рейтинг: 0 / 0
120 сообщений из 120, показаны все 5 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Наследование(ООП). растолкуйте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]