Переключение на Главную Страницу Страницы: 1 ... 6 7 [8] 9 10 ... 13 ОтправитьПечать
Очень популярная тема (более 25 ответов) Полиморфизм ЗаменитьЭксзБазовогоКласса (число прочтений - 80409 )
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #105 - 31. Мая 2006 :: 19:05
Печать  
kms писал(а) 31. Мая 2006 :: 17:47:
Что касается наследования и агрегации, то как я понимаю, основываясь на концепциях, изложенных Бучем, наследование - это отношение общего и частного, а агрегация - отношение целого и части.

В этом плане не вижу проблем, почему класс Документ_РКО не может быть подклассом класса Документ_СБИ.
Ведь реально это и есть частный случай документа с бух. итогами.

Теоретически можно класс "Документы_СБИ" переписать на класс "БухИтогиВМодулеДокумента", и тогда агрегирование будет вполне так себе оправдано.

Хотя вот Фаулер, например, считает, что заменять наследование агрегированием стоит в тех случаях, когда наследник использует не весь интерфейс родительского класса, а только его часть. Это явно не этот случай.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #106 - 31. Мая 2006 :: 19:06
Печать  
sedmin
Я ж тебе сказал, что детали реализации мне нужно смотреть.
Если тебе ответ нужен сейчас - это действительно не ко мне вопрос, а к Deb'у.

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

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

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #107 - 31. Мая 2006 :: 19:09
Печать  
sedmin писал(а) 31. Мая 2006 :: 18:48:
При чем здесь наследование служебных функций? Вопрос звучит так:

Чем отличается результат вызова Сам(Контекст) при вызове из модуля родителя и из модуля наследника?

Это же ссылка на один и тот же объект. Или не так?


ВОТ !!! Прислушайтесь к нему. Это же ключевой момент.

Повсюду в 1С++ Сам(Контекст) - это ссылка на один и тот же обект. Тот самый, что был создан с помощью СоздатьОбъект(). За одним, нафиг, исключением: когда мы вызываем ЗаменитьЭксзБазовогоКласса(). Вопрос: ПОЧЕМУ?

И второй вопрос: кому повредит, если это поведение изменить? Кому станет лучше я уже знаю.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #108 - 31. Мая 2006 :: 19:14
Печать  
Палыч писал(а) 31. Мая 2006 :: 17:34:
Точнее, даже, так: я на 100% уверен, что наследование, в данном абстрактном случае, не понадобится. Почему? Ну... это длинная история. И совсем не интересная Подмигивание

Это очень, очень интересная история.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #109 - 31. Мая 2006 :: 19:19
Печать  
Цитата:
Повсюду в 1С++ Сам(Контекст) - это ссылка на один и тот же обект. Тот самый, что был создан с помощью СоздатьОбъект(). За одним, нафиг, исключением: когда мы вызываем ЗаменитьЭксзБазовогоКласса(). Вопрос: ПОЧЕМУ?

Не, Федор, ну разные это вопросы.

1. Что делать с ЗаменитьБазовыйОБъект()
2. Нормальная изоляция классов.

Понимешь?
Мы можем решить (и, скорее всего, решим) вопрос 1 так, как ты предлагаешь.
Т.е. организуем виртуализацию этого метода.

Но при этом все равно останемся заложниками реализации Deb'a.
Удобной, привычной, но опасной реализации.

Насколько я сейчас представляю, Deb просто конструирует общий класс путем сливания в него всех подкласса и всех суперклассов с каким-то разрешением конфликтов (Артур сказал, что берется первый попавшийся метод с совпадающим именем).
Поэтому контекст один, и обращаться ты можешь куда хочешь и сколько хочешь.
Это не ООП, но это концепция классов Deb'a. И мы ее любим. Но любит ли она нас?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #110 - 31. Мая 2006 :: 19:21
Печать  
fez писал(а) 31. Мая 2006 :: 19:14:
Палыч писал(а) 31. Мая 2006 :: 17:34:
Точнее, даже, так: я на 100% уверен, что наследование, в данном абстрактном случае, не понадобится. Почему? Ну... это длинная история. И совсем не интересная Подмигивание

Это очень, очень интересная история.

Угу. Расскажи, а? Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #111 - 31. Мая 2006 :: 19:25
Печать  
kms писал(а) 31. Мая 2006 :: 19:19:
Насколько я сейчас представляю, Deb просто конструирует общий класс путем сливания в него всех подкласса и всех суперклассов с каким-то разрешением конфликтов (Артур сказал, что берется первый попавшийся метод с совпадающим именем).

Блин, вы что FAQ не читаете? Первый попавшийся...

Цитата:
Q. А если у меня

класс Наследование = classes\nasled.cls:Справочник.Номенклатура, Документ.Заявка {};
Каким макаром наследуются одинаковые свойства и медоды? Например, Вид()?
A. Если не переопределить Вид() в своем классе, то вызываться будет Вид() для Справочник.Номенклатура, потому как он первый в списке.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #112 - 31. Мая 2006 :: 19:28
Печать  
fez писал(а) 31. Мая 2006 :: 19:09:
Повсюду в 1С++ Сам(Контекст) - это ссылка на один и тот же обект. Тот самый, что был создан с помощью СоздатьОбъект(). За одним, нафиг, исключением: когда мы вызываем ЗаменитьЭксзБазовогоКласса(). Вопрос: ПОЧЕМУ?

По идее, метод ЗаменитьБазовыйОбъект() как "плохой" не должен быть экспортным (и соответственно, виртуальным). Но тогда к нему нельзя будет обратиться из модуля, так как доступен он только через Сам(Контекст).

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

К сожалению, его нельзя и переопределить (или можно? тогда как обращаться к базовому?). Похоже, правильным решением будет инкапсулировать его в другой метод, который уже можно будет наследовать, так как в нем можно будет реализовать ту логику, которая больше по душе.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #113 - 31. Мая 2006 :: 19:29
Печать  
kms писал(а) 31. Мая 2006 :: 19:19:
Поэтому контекст один, и обращаться ты можешь куда хочешь и сколько хочешь.
Это не ООП, но это концепция классов Deb'a. И мы ее любим. Но любит ли она нас?

Не хочет - заставим. Поцелуй Нас много, а она одна.

Кстати, в питоне точно такая же концепция классов, как я уже успел продемонстрировать Улыбка Так что это еще и концепция Гвидо Ван Россума. (во, я и для себя авторитета нашел, теперь и мне есть на кого ссылаться Язык)

В конце концов, твой вопрос 2 - это однозначный вопрос обратной совместимости. И если его решить так, как ТЫ этого хочешь (хотел в начале ветки), то это будет уже совсем другой продукт.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #114 - 31. Мая 2006 :: 19:35
Печать  
sedmin писал(а) 31. Мая 2006 :: 19:28:
По идее, метод ЗаменитьБазовыйОбъект() как "плохой" не должен быть экспортным (и соответственно, виртуальным). Но тогда к нему нельзя будет обратиться из модуля, так как доступен он только через Сам(Контекст).

А ты почему считаешь, что это "плохой" метод. Чем плох с твоей точки зрения?

fez
Не читал FAQ. Ну зачем читать FAQ, когда есть 3 подсказки: звонок другу (Артур), помощь зала (форум) и 100/0 (код).
Чукча не читатель, чукча писатель.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #115 - 31. Мая 2006 :: 19:43
Печать  
fez писал(а) 31. Мая 2006 :: 19:29:
В конце концов, твой вопрос 2 - это однозначный вопрос обратной совместимости. И если его решить так, как ТЫ этого хочешь (хотел в начале ветки), то это будет уже совсем другой продукт.

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

На самом деле, конечно, нельзя менять модель. Все привыкли, код уже написан.
Оставляем контроль корректности доступа на разработчике.
В конце концов, теперь, обращаясь из Документы_СБИ к реквизиту Фирма документа РКО ты будешь оглядываться, не видит ли тебя кто-то из отцов-основателей ООП.

Мне этого достаточно Смех

P.S.
Если мы поменяем модель, Sedmin нас точно не простит.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #116 - 31. Мая 2006 :: 20:23
Печать  
Точно не прощу. Мы уже вовсю используем экспортные методы как виртуальные, и альтернативы этому я не вижу.

Объясню, чем плох метод ЗаменитьБазовыйОбъект(). (А то, можно подумать, вы сами об этом не занете).

1. Подобного метода нет ни в одном ОО языке программирования. Настоящему джентельмену этого довода было бы достаточно. Так как джентельменов среди нас нет, идем дальше.

2. В нормальном языке почему такого метода нет? Потому что там делается
СоздатьОбъект("Наследник").Заполнить(ИдЗаписиБД). Так как в 1С есть две разновидности объектов - те, что создаются через СоздатьОбъект(), и те, которые берутся из ниоткуда (или из фабрики объектов, которая не хочет делать объекты класса "Наследник"), то нужен способ получения наследника из уже готового объекта класса "Родитель".

Для первых объектов годится обычная модель заполнения объектов, а для вторых придумали метод ЗаменитьБазовыйОбъект().

И тут нас ждут грабли: при попытке написать Наследник.ЗаменитьБазовыйОбъект(объект.ТекущийЭлемент()) мы получаем ошибку: "можно использовать только объект, созданный через СоздатьОбъект(), или ГрупповойКонтекст".

Зачем использовать для задания наследования объект, созданный через СоздатьОбъект() непонятно. Можно было сразу сделать СоздатьОбъект("Наследник") и делать с ним все, что угодно.
ТекущиеЭлементы() и ТекущиеДокументы() тоже нельзя использовать.
Построение произвольной иерархии с изменением наследования классов тоже не так давно отключили.

Остается одно применение методу - создавать наследников для форм документов и справочников. (кстати, интересно, что если создавать наследников формам списков?) Должен этот метод быть для этого полиморфным? Не знаю.

Кстати, не знаю как сейчас, а раньше можно было создать наследника для таблиц и списков, которые лежат на форме.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #117 - 31. Мая 2006 :: 20:38
Печать  
sedmin писал(а) 31. Мая 2006 :: 20:23:
Точно не прощу. Мы уже вовсю используем экспортные методы как виртуальные, и альтернативы этому я не вижу.

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

Цитата:
И тут нас ждут грабли: при попытке написать Наследник.ЗаменитьБазовыйОбъект(объект.ТекущийЭлемент()) мы получаем ошибку: "можно использовать только объект, созданный через СоздатьОбъект(), или ГрупповойКонтекст".

А оно надо, использовать для бесконтекстных объектов? Я тоже думал на эту тему.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #118 - 31. Мая 2006 :: 21:46
Печать  
fez
Федор, я еще раз подумал. Я поддерживаю твой вариант.
ЗаменитьБазовыйОбъект() должен являться виртуальной функцией, определенной во всех классах.
И, соответственно, должен работать со всей иерархией.

Напомните мне, пожалуйста
Мы уже рассматривали идею динамического конструирования иерархии классов на этапе выполнения?
Дело в том, что у нас нет классов, как таковых. Мы имеем дело с наборами контекстов с логикой замещения методов.
Ну и почему тогда не конструировать объекты налету?

Типа
Цитата:
// создание шаблона
// возьмем за основу пример Федора
Класс = СоздатьКласс("Документ.РКО"); // создание класса

// конструирование
Класс.ДобавитьСуперкласс("Документы_СБИ", ""); // имя класса, уровень иерархии

// переопределение виртуальных функций
Класс.ДобавитьПодкласс("Документ_РКО", ""); // имя класса, уровень иерархии

Если ПризнакУчета = "НафНаф" Тогда

   // переопределение виртуальных функций подкласса
   Сам.ДобавитьПодкласс("Документы_РКО_УчетНафНаф", "Документ_РКО");

КонецЕсли;

// инстанциирование объекта
Сам = Класс.СоздатьОбъект(...); // вызов конструкторов в соотв. с иерархией
Сам.ЗаменитьБазовыйОбъект("Документ.РКО", "Контекст"); // встраивание объекта


Т.е. мы имеем возможность динамического  конструирования иерархии с учетом необходимых суперклассов и подклассов + возможность инстанциирования описанных объектов.

Давайте, критикуйте. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #119 - 01. Июня 2006 :: 04:55
Печать  
Мое мнение: ну его нафиг, такое счастье. Давайте не будем делать того, в чем нет потребности. (Мантра экстемальных программистов: "Нам это никогда не понадобится".)

Если уж говорить про сказки, то мне бы лучше хотелось видеть два других момента:

1. В defcls.prm  указывать только расположение файла класса. Все описание класса иметь в файле класса. В том числе  его иерархия, параметры по умолчанию, и т.д.
Примерно как в Яве.

2. Иметь возможность загрузить все файлы классов из каталога. Опять же как в Яве.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 6 7 [8] 9 10 ... 13
ОтправитьПечать