Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование 
:(
    Опции темы
w1nd
Дата 9.5.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Модератор: Вынесено из 5 основных отличий между Java и C++ 


Цитата
В таком случае напишите пожалуйста полностью ООПрограмму на С++ (Ну или "более" ООПрограмму)

Вместо примера кода классический пример из книжек: класс Point, класс Size обладают некоторыми полями и методами, класс Square их наследник и в то же время и Point, и Size. К сожалению, на Java этого номально не сделать. Так же нельзя сделать гуишный компонент для ввода строки наследником строки.  


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 10.5.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Оффтоп: 
Цитата(w1nd @  9.5.2006,  10:21 Найти цитируемый пост)
Вместо примера кода классический пример из книжек: класс Point, класс Size обладают некоторыми полями и методами, класс Square их наследник и в то же время и Point, и Size. К сожалению, на Java этого номально не сделать. Так же нельзя сделать гуишный компонент для ввода строки наследником строки.  

Какие-то странные примеры наследования. У автора книжки с ООП было явно туговато.  


--------------------

PM   Вверх
w1nd
Дата 10.5.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @ 10.5.2006,  14:56)
Оффтоп: 
Цитата(w1nd @  9.5.2006,  10:21 Найти цитируемый пост)
Вместо примера кода классический пример из книжек: класс Point, класс Size обладают некоторыми полями и методами, класс Square их наследник и в то же время и Point, и Size. К сожалению, на Java этого номально не сделать. Так же нельзя сделать гуишный компонент для ввода строки наследником строки.  

Какие-то странные примеры наследования. У автора книжки с ООП было явно туговато.

Первый пример есть во всех книжках по ООП. А в чем странность? 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  10.5.2006,  13:29 Найти цитируемый пост)
Первый пример есть во всех книжках по ООП. А в чем странность?  

В том, что наследовать Square от Point и Size нельзя - квадрат не есть точка и никак не размер. Впервые такой пример встречаю просто. 


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
В том, что наследовать Square от Point и Size нельзя - квадрат не есть точка и никак не размер. Впервые такой пример встречаю просто. 

На мой взгляд, вы заблуждаетесь, гражданин начальник. Видимо, просто привыкли к объектной модели Bordand VCL, MFC, JavaBeans и им подобным - а они довольно далеки от ООП. Можно было бы это обсудить где-нить отдельно. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  07:59 Найти цитируемый пост)
На мой взгляд, вы заблуждаетесь, гражданин начальник. Видимо, просто привыкли к объектной модели Bordand VCL, MFC, JavaBeans и им подобным - а они довольно далеки от ООП. Можно было бы это обсудить где-нить отдельно.  

Наследование - это отношение is-a, вот и все.

Цитата

Inheritance is also called generalization, because the is-a relationships capture a hierarchical relationship between classes of objects. For instance, a "fruit" is a generalization of "apple", "orange", "mango" and many others. We say that fruit is an abstraction of apple, orange, etc. Conversely, we can say that since apples are fruit (i.e. an apple is-a fruit), that they inherit all the properties common to all fruit, such as being a fleshy container for the seed of a plant.

http://en.wikipedia.org/wiki/Inheritance_%...uter_science%29

Наследовать квадрат от неправильно, тк квадрат не есть точка, тем более не "размер".   


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Наследование - это отношение is-a

Именно так. Но вы (как и многие) допускаете распространенную ошибку - отождествляете эти классы с объектами реального мира. Для квадрата свойственны все поля и методы координаты и размера - именно это (все поля и методы) определяет наличие отношения is-a для классов.    

Это сообщение отредактировал(а) w1nd - 11.5.2006, 19:09


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  10:02 Найти цитируемый пост)
Для квадрата свойственны все поля и методы координаты и размера - именно это (все поля и методы) определяет наличие отношения is-a для классов.    


Простой пример:
Код

class Point { ... }

class Square : Point { ... }

....

void DrawPoint(Point point) {....}
void CreatePolygon(Point[] points) {}

Square square = new Square();
DrawPoint(square); // что будет изображено?
CreatePolygon(new Point[] {square}); // как будет создан полигон?



Цитата(w1nd @  11.5.2006,  10:02 Найти цитируемый пост)
Но вы (как и многие) допускаете распространенную ошибку - отождествляете эти классы с объектами реального мира. 

ООП и постоено на объектах реального мира, просто в каждой ситуации програмист рассматривает лишь отдельные стороны объектов, важные в данной ситуации. С точки зрения геометрии квадрат не есть точка. Да, он унаследует два поля точки, но за выигрыш двух строк кода придется платить - например, можно будет откастить объект квадрата к объекту точки или размера, что будет приводить к появлению багов, непонятному коду. К примеру, у точки есть метод Paint, который мы перегружаем в Square. Тогда метод DrawPoint(Point point) приведет к изображению не точки, а квадрата при вызове DrawPoint(square). 
Согласно такой логике мне нужно наследовать класс Company от класса Contact, поскольку последний содержит все поля (адрес, имя, телефон, емейл, итп). К чему такой наследование приведет нетрудно догадаться. 
 


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @ 11.5.2006,  20:04)
ООП и постоено на объектах реального мира, просто в каждой ситуации програмист рассматривает лишь отдельные стороны объектов, важные в данной ситуации. С точки зрения геометрии квадрат не есть точка. Да, он унаследует два поля точки, но за выигрыш двух строк кода придется платить - например, можно будет откастить объект квадрата к объекту точки или размера, что будет приводить к появлению багов, непонятному коду. К примеру, у точки есть метод Paint, который мы перегружаем в Square. Тогда метод DrawPoint(Point point) приведет к изображению не точки, а квадрата при вызове DrawPoint(square). 
Согласно такой логике мне нужно наследовать класс Company от класса Contact, поскольку последний содержит все поля (адрес, имя, телефон, емейл, итп). К чему такой наследование приведет нетрудно догадаться.

ООП построено не на объектах реального мира, а на принципе инкапсуляции и полиморфизма smile.

Само существование методов вроде DrawPoint или CreatePolygon полностью противоречит принципам ООП. Только сам объект может себя рисовать или создавать. И если бы класс Контакт не обладает атрибутом Пол или Возраст, он подойдет для Компании; в ином случае нужно просто выделить общие для них поля и методы в отдельный(е) класс(ы) и назвать соответствующе.   

Это сообщение отредактировал(а) w1nd - 11.5.2006, 20:28


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  11:27 Найти цитируемый пост)

Само существование методов вроде DrawPoint или CreatePolygon полностью противоречит принципам ООП. 


Замените DrawPoint на метод Point.Paint, и проблема останется. CreatePolygon вполне может относиться к классу, занимающемуся проецированием полигонов из 3D на экран, тогда полигон сам себя прорисовать не сможет, так как ему будет необходимо знать ряд других параметров, возможно, выполнить к-л оптимизации при прорисовке, итп.

Цитата(w1nd @  11.5.2006,  11:27 Найти цитируемый пост)
И если бы класс Контакт не обладает атрибутом Пол или Возраст, он подойдет для Компании

Предположим, что пол и возраст не важен и мы унаследовали Company от Contact. Бизнес-логика приложения очень сложная, где-то я по ошибке передал Company в метод, ожидающий Contact. На дебаге я потрачу раз в 30 больше времени, чем если бы я потратил 2 минуты на создание общего класса Entity. 


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Замените DrawPoint на метод Point.Paint, и проблема останется.

Какая проблема? Проблема здесь только в том, что пользователь класса Point хочет знать, каким образом этот класс себя нарисует, а знать ему (пользователю) этого не положено.
Цитата
CreatePolygon вполне может относиться к классу, занимающемуся проецированием полигонов из 3D на экран, тогда полигон сам себя прорисовать не сможет, так как ему будет необходимо знать ряд других параметров, возможно, выполнить к-л оптимизации при прорисовке, итп.

И снова я вижу грубое нарушение принципа инкапсуляции. Если полигон не может, следует либо расширять функционал полигона, либо расширять функционал канвы (преобразования, оптимизации и прочее).

Цитата
Предположим, что пол и возраст не важен и мы унаследовали Company от Contact. Бизнес-логика приложения очень сложная, где-то я по ошибке передал Company в метод, ожидающий Contact. На дебаге я потрачу раз в 30 больше времени, чем если бы я потратил 2 минуты на создание общего класса Entity.

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


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  12:07 Найти цитируемый пост)

И снова я вижу грубое нарушение принципа инкапсуляции. Если полигон не может, следует либо расширять функционал полигона, либо расширять функционал канвы (преобразования, оптимизации и прочее).

Какое ж тут нарушение инкапсуляции? Инкапсуляция - это information hiding, если мне достаточно для отрисовки знать координаты вершин многоугольника, то я могу их получить из пропертей (геттеров) и инкапсуляции не нарушу. В контексте задачи может не иметь смысла перегружать подобные классы функционалом, писать Квадраты, которые себя рисуют, трансформируют, сериализуют да еще и в базу сами пишутся. 
 
Цитата(w1nd @  11.5.2006,  12:07 Найти цитируемый пост)
Какая-такая ошибка может возникнуть, если метод, рассчитывающий на контакт его и получил?  

Да какая угодно. Например, создается репорт, содержащий к-л статистику по посещениям сайта (скажем, Контакт/Компания содержат поля MonthlyHits и IP). В данный метод передается массив Контактов, в который по ошибке попала одна Компания. У всех этих объектов вызывается проперти MonthlyHits, IP. Такой баг и заметить сложно. 


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Какое ж тут нарушение инкапсуляции? Инкапсуляция - это information hiding, если мне достаточно для отрисовки знать координаты вершин многоугольника, то я могу их получить из пропертей (геттеров) и инкапсуляции не нарушу.

Мы про ООП или про что? Инкапсуляция подразумевает не сокрытие информации (это как самоцель не имеет смысла), а сокрытие способа хранения, реализации, взаимодействия. Это необходимо для того, чтобы не переписывать клиентский код при внесении изменений в реализацию класса. Геттеры/сеттеры - это как раз нарушение инкапсуляции (замаскированный прием структурного программирования). Вообще (как я и говорил, вы, похоже, зацикливаетесь на существующих framework'ах, которые примером ООП не являются), само по себе понятие properties объекта очень сомнительно с точки зрения ООП.

Цитата
Да какая угодно. Например, создается репорт, содержащий к-л статистику по посещениям сайта (скажем, Контакт/Компания содержат поля MonthlyHits и IP). В данный метод передается массив Контактов, в который по ошибке попала одна Компания. У всех этих объектов вызывается проперти MonthlyHits, IP. Такой баг и заметить сложно.

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


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
powerOn
Дата 11.5.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Цитата

Мы про ООП или про что? Инкапсуляция подразумевает не сокрытие информации (это как самоцель не имеет смысла), а сокрытие способа хранения, реализации, взаимодействия. Это необходимо для того, чтобы не переписывать клиентский код при внесении изменений в реализацию класса.


Чует мое сердце, что для этого нужно наследование, а не инкапсуляция...  


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 11.5.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  11.5.2006,  22:40 Найти цитируемый пост)
Вообще (как я и говорил, вы, похоже, зацикливаетесь на существующих framework'ах, которые примером ООП не являются), само по себе понятие properties объекта очень сомнительно с точки зрения ООП.

1. Что же тогда по твоему хороший пример?
2. Чем properties плохи (то что при их использовании  можно спокойно менять способ хранения данных, я тебе уже демонстрировал)? 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1261 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.