Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Наследование - не композиция (число прочтений - 6998 )
kbakaras
Junior Member
**
Отсутствует


Ребята, давайте жить дружно!

Сообщений: 20
Зарегистрирован: 22. Июня 2006
Пол: Мужской
Наследование - не композиция
08. Ноября 2006 :: 07:52
Печать  
Если я не ошибся в своих тестах, то получается такая ситуация. При обращении к public-реквизитам родителя из методов объекта-наследника отрабатывают методы ПриПолучении и ПриЗаписи объекта-родителя (если таковые определены в нём для референсируемого реквизита). При наследовании такого быть не должно. Наследование --- это всё-таки не композиция. Наследник не является клиентом по отношению к родителю.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #1 - 08. Ноября 2006 :: 08:14
Печать  
ИМХО ты говоришь неверно. Печаль
Если какое-то поведение определено в родительском классе, оно по умолчанию переходит в класс-потомок - в этом и есть смысл наследования !
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #2 - 08. Ноября 2006 :: 08:34
Печать  
artbear писал(а) 08. Ноября 2006 :: 08:14:
ИМХО ты говоришь неверно. Печаль
Если какое-то поведение определено в родительском классе, оно по умолчанию переходит в класс-потомок - в этом и есть смысл наследования !

имхо он говорит не про обращение к свойствам наследника унаследованным от базового,
а про обращение к свойствам базового класса ИЗ наследника
  

1&&2&&3
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #3 - 08. Ноября 2006 :: 09:08
Печать  
Правильно, это и есть часть наследования - возможность обращения к свойствам базового класса из класса-наследника Улыбка

Пусть автор дает развернутый вопрос.
Мы долго можем телепатировать Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #4 - 08. Ноября 2006 :: 09:33
Печать  
trad писал(а) 08. Ноября 2006 :: 08:34:
artbear писал(а) 08. Ноября 2006 :: 08:14:
ИМХО ты говоришь неверно. Печаль
Если какое-то поведение определено в родительском классе, оно по умолчанию переходит в класс-потомок - в этом и есть смысл наследования !

имхо он говорит не про обращение к свойствам наследника унаследованным от базового,
а про обращение к свойствам базового класса ИЗ наследника

ИМХО какая разница?
Почему "При наследовании такого быть не должно"? Неважно, что мы обращались бы к этим свойствам из потомка... Если бы такого "не должно было быть", то, думается мне, ломался бы принцып наследования, т.к. всякое поведение при записи/чтения свойств суперкласса пришлось бы дублировать (?) в потомке... А ещё пришлось бы сначала узнать, что нужно сделать при записи/чтения свойства предка, для чего полапатить его код... а следовательно и инкапсуляции - капут.
Я правильно мыслю?
  
Наверх
ICQ  
IP записан
 
kbakaras
Junior Member
**
Отсутствует


Ребята, давайте жить дружно!

Сообщений: 20
Зарегистрирован: 22. Июня 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #5 - 08. Ноября 2006 :: 11:47
Печать  
Попробую поставить вопрос немного иначе. Пусть есть код:
[code]
// класс Б1

Перем Поле Экспорт;

Процедура Конструктор()
    Поле=0;
КонецПроцедуры

Процедура ПриПолучении_Поле(_Значение)
    _Значение=Поле;
КонецПроцедуры

Процедура ПриЗаписи_Поле(_Значение)
КонецПроцедуры

// класс Н1 : Б1 (т.е. потомок Б1)

Функция Я(Конт) Возврат Конт КонецФункции

Процедура Конструктор()
    Я(Контекст).Поле=1387;
КонецПроцедуры
[/code]

В этом примере конструктор класса Н1 не сможет проинициализировать нужным значением унаследованный реквизит Поле, т.к. отработает метод ПриЗаписи его суперкласса.

Т.е. выходит, что суперкласс относится к коду своего наследника как к клиентскому. Получается, что наследование в 1с++ -- это вариант композиции, при котором все сообщения наследнику по умолчанию транслируются базовому классу. Мне кажется, это не совсем то, что подразумевается под наследованием в ООД.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #6 - 08. Ноября 2006 :: 11:48
Печать  
trad писал(а) 08. Ноября 2006 :: 08:34:
artbear писал(а) 08. Ноября 2006 :: 08:14:
ИМХО ты говоришь неверно. Печаль
Если какое-то поведение определено в родительском классе, оно по умолчанию переходит в класс-потомок - в этом и есть смысл наследования !

имхо он говорит не про обращение к свойствам наследника унаследованным от базового,
а про обращение к свойствам базового класса ИЗ наследника

А какая разница? ИЗ наследника ты же все равно обращаешься к ним не непосредственно, а через Сам(Контекст).
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #7 - 08. Ноября 2006 :: 11:51
Печать  
[quote author=kbakaras link=1162972361/0#5 date=1162986421]
Т.е. выходит, что суперкласс относится к коду своего наследника как к клиентскому. Получается, что наследование в 1с++ -- это вариант композиции, при котором все сообщения наследнику по умолчанию транслируются базовому классу.[/quote]
Да, именно так и получается.
Сдается мне, что ты просто хочешь организовать protected поле своими силами :)
  
Наверх
www  
IP записан
 
kbakaras
Junior Member
**
Отсутствует


Ребята, давайте жить дружно!

Сообщений: 20
Зарегистрирован: 22. Июня 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #8 - 08. Ноября 2006 :: 12:01
Печать  
Да, fez, эта задача того же плана. Практически, невозможность организовать protected-члены в 1с++ вместе с реализацией наследования в виде вырожденного случая композиции ограничивает применяемость ООП в 1с++ лишь организацией абстрактных типов данных. Это уже не мало. И я с успехом это использую. Но построение осмысленных иерархий классов (т.е. ООД) невозможно. А композицию в большинстве случаев удобнее использовать в явном виде.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #9 - 08. Ноября 2006 :: 12:10
Печать  
kbakaras писал(а) 08. Ноября 2006 :: 12:01:
Но построение осмысленных иерархий классов (т.е. ООД) невозможно.

Вот про это расскажи плиз поподробнее.
Во-первых, что такое ООД?
Во-вторых, почему 1С++-кие иерархии классов не являются осмысленными?
  
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #10 - 08. Ноября 2006 :: 12:19
Печать  
fez писал(а) 08. Ноября 2006 :: 11:48:
А какая разница? ИЗ наследника ты же все равно обращаешься к ним не непосредственно, а через Сам(Контекст).

я всего лишь уточнил высказывание автора, ничего не утверждая/опровергая
  

1&&2&&3
Наверх
 
IP записан
 
kbakaras
Junior Member
**
Отсутствует


Ребята, давайте жить дружно!

Сообщений: 20
Зарегистрирован: 22. Июня 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #11 - 08. Ноября 2006 :: 12:26
Печать  
ООД --- это объектно-ориентированный дизайн (см. Буч Г.). Парадигма в проектировании программных систем, в соответствии с которой, в частности, предложение может быть представлено в виде иерархии классов (статической) и  иерархии объектов (возможно, динамической). При этом активно используются все концепции ООП (абстракция, инкапсулирование, наследование, полиморфизм).

Классы, которые можно построить на 1с++, до этой концепции не дотягивают. Из-за того, что наследование практически отсутствует в текущей реализации.

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

Сокрытие - важнейшая концепция при наследовании. И если наследник при наследовании видит в родителе только то, что должен видеть предполагаемый клиент родителя, то такое наследование даёт мало пользы. В классе должно быть как минимум 2 двери - для клиентов и для наследников. В некоторых реализациях их 3. Ещё одна - для близких (партнёров). Но без неё жить можно, т.к. она не является системообразующей.
  
Наверх
 
IP записан
 
kbakaras
Junior Member
**
Отсутствует


Ребята, давайте жить дружно!

Сообщений: 20
Зарегистрирован: 22. Июня 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #12 - 08. Ноября 2006 :: 12:28
Печать  
В первом абзаце "предложение" читать как "приложение".

(fez: Есть такая кнопка - "изменить".)
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наследование - не композиция
Ответ #13 - 08. Ноября 2006 :: 13:23
Печать  
Вот и замечательно: как только дал развернутый пример, все стало просто и понятно Улыбка

1. Т.к. 1С++ базируется изначально на синтаксисе 1С, а у 1С есть два вида доступа - Экспорт(паблик) и без Экспорта (приват), поэтому и был выполнен только вариант с этими двумя видами доступа.
ИМХО Для подавляющего большинства задач такой схемы хватает.

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

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

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


Для правки ошибки проектирования есть два пути (оба - это смена дизайна)
1. либо править код базового класса
2. либо перед этим базовым классом Отец встроить еще один базовый класс Дед, у которого будет объявлена эта переменная как Экспорт, без всяких ограничений по доступу.
И для доступа к этой переменной, минуя базовый класс Отец, использовать конструкцию типа
Сам().ПолучитьБазовыйКласс("Дед").НужнаяПеременная = Значение
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Наследование - не композиция
Ответ #14 - 09. Ноября 2006 :: 18:03
Печать  
kbakaras
Если в сеттер ридонли-свойства ты бы вставил вызов исключения, вопрос прозвучал бы иначе  Подмигивание.

В приведенном примере, конструктор базового класса имеет смысл сделать параметризированным. При этом, из конструктора наследника следует явно вызывать конструктор базового класса:

Код
Выбрать все
// класс Б1

Перем
    Поле Экспорт,
    м_поле     // Здесь храним значение поля.
;

Функция Я(Конт) Возврат Конт КонецФункции

процедура _конструктор(параметр) экспорт     // протектед конструктор
    м_поле = параметр;
конецПроцедуры

Процедура Конструктор()
    _конструктор(0);
КонецПроцедуры

Процедура ПриПолучении_Поле(_Значение)
    _Значение = м_поле;
КонецПроцедуры

Процедура ПриЗаписи_Поле(_Значение)
     Я(Контекст)._ВыброситьИскл("Попытка присвоить значение ридонли-свойству!");
КонецПроцедуры

// класс Н1 : Б1 (т.е. потомок Б1)

Функция Я(Конт) Возврат Конт КонецФункции

Процедура Конструктор()
    Я(Контекст).ПолучитьБазовыйКласс()._конструктор(1387);   // _конструктор может быть переопределен, поэтому вызываем метод именно базового класса.
КонецПроцедуры
  



зы: у 1С++ нет проблем с наследованием. Проблемы, скорее,  в головах программистов (ничего личного Подмигивание).


  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать