Переключение на Главную Страницу Страницы: 1 ... 3 4 [5]  ОтправитьПечать
Очень популярная тема (более 25 ответов) ПолучитьТекущийОбъект() (число прочтений - 34420 )
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #60 - 03. Июня 2006 :: 07:54
Печать  
А реализацию по-любому надо делить на CComponentClass и CProxyClass.

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

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #61 - 03. Июня 2006 :: 08:06
Печать  
Для чего нужен я() ?

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

Это как в С++
Можно написать:
ptr->SomeFunc(),
а можно
ptr->SomeClass::SomeFunc()

  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #62 - 03. Июня 2006 :: 08:13
Печать  
Да это я понял.
Цитата:
Сейчас для этого приходится делать ПолучитьБазовыйКласс("Какой-то").ВызовМетода(). И именно поэтому ПолучитьБазовыйКласс работает неполиморфно.
Здесь же можно просто писать я().ВызовМетода(), и быть уверенным, что поиск метода не уйдет в наследников.

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

добавлено:
Или ты хочешь, не переопределяя метод в своем классе, т.е. зная, что его нет, а в суперклассе он есть, вызывать свой класс, зная, что выполнится метод суперкласса?
Это я могу понять, но это неочевидное решение, лучше явно квалифицировать суперкласс, так, как ты сделал в примере на C++.

чуть добавил
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #63 - 03. Июня 2006 :: 08:17
Печать  
kms писал(а) 03. Июня 2006 :: 07:43:
orefkov
Цитата:
Да как ты это сделаешь, если при этом старый клиентский код перестанет работать так, как работал? Ты согласен с предложенным мною принципом - где ты хочешь использовать новый функционал, ты должен писать по-новому?

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

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

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

Как много было вопросов от пользователей, связанных с тонкостями реализации ООП, за последний год на итлэнде?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #64 - 03. Июня 2006 :: 08:21
Печать  
kms писал(а) 03. Июня 2006 :: 08:13:
Да это я понял.
Как я понимаю, первый раз ты вызываешь метод суперкласса, а я().ВызовМетода() - это вызов текущего класса.
Насчет базового класса - это-то понятно, часто используется при дополнении методов базовых классов.
Непонятно, зачем вызывать метод текущего класса, отрезая наследников.

Если мне надо вызвать метод МОЕГО класса, я просто пишу ВызовМетода(), он блин в этом же модуле.
А я().ВызовМетода - в текущем модуле не найдет метода, и пойдет искать в моих базовых классах. Просто сравни длину записи:

Сам(Контекст).ПолучитьБазовыйКласс().ВызовМетода();
и
я().ВызовМетода();

А результат один и тот же. А если не видно разницы, зачем писать длиннее?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #65 - 03. Июня 2006 :: 08:31
Печать  
Цитата:
Как много было вопросов от пользователей, связанных с тонкостями реализации ООП, за последний год на итлэнде?

Хм. Да уж.

Да, именно декларатором типа "класс правильный Документ_РКО {}".
Если смешать правильные и неправильные, тогда при вызове из правильного будет использоваться CProxyClass, а при вызове из обычного - CComponentClass. Это потенциальный источник проблем, но позволит переводить классы в рабочем порядке.
Честно говорю, полностью список проблем еще не обдумывал - поэтому есть предложение применять декларатор ко всей конкретной иерархии сразу.

Цитата:
Как мне быстро определить, не глядя в реализацию, что вот этот класс я могу

Саня, ну, конечно, никак. Ну это не вопрос, а подколы какие-то.
А по-серьезному, нужно посмотреть:
1. Для каждого суперкласса: какие методы, не входящие в декларацию интерфейса, вызываются?
Это сделать просто. Это могут быть методы подкласса - тогда их просто нужно внести в интерфейс.
Это могут быть методы других суперклассов - тогда это нужно переписать на доступ через подкласс.
2. Сделать контроль доступа к свойствам подклассов и других суперов.
3. Сделать контроль определения методов подкласса со множественными определениями в суперклассах.

Т.е. сделать нормальный рефакторинг класса, и все.
Либо не переводить старые классы, а начинать переводить с новых.

И юнит-тестирование должно помочь. Но тут меня совсем щас в утописты запишут.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #66 - 03. Июня 2006 :: 08:33
Печать  
Цитата:
А я().ВызовМетода - в текущем модуле не найдет метода, и пойдет искать в моих базовых классах.

А, ну тогда понятно. Я как-то полагал, что я() включает контекст текущего модуля.
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #67 - 03. Июня 2006 :: 08:37
Печать  
То есть из-за твоей любви к "чистым" принципам ООП я должен буду перелопачивать весь свой старый код?

Теперь представь, сколько работы надо будет переделать, чтобы реализовать работу "правильных" классов. Доделывать разбор заголовков классов, процедуру создания КОПов, да много чего еще. А вот вирт() и я() я сегодня добавил в ветку в репозитарии, изменив пяток строк в componentclass.cpp
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #68 - 03. Июня 2006 :: 08:40
Печать  
Цитата:
Сам(Контекст).ПолучитьБазовыйКласс().ВызовМетода();
и
я().ВызовМетода();

А результат один и тот же. А если не видно разницы, зачем писать длиннее?

Я бы все же явно квалифицировал:
Цитата:
база("Документ.РКО").ВызовМетода();

А то сделай ромб, и все равно будешь писать
Цитата:
Сам(Контекст).ПолучитьБазовыйКласс().ВызовМетода();

  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #69 - 03. Июня 2006 :: 08:47
Печать  
[quote author=orefkov link=1149237614/60#67 date=1149323836]То есть из-за твоей любви к "чистым" принципам ООП я должен буду перелопачивать весь свой старый код?
[/quote]
Нет, конечно, не должен. Можешь перелопачивать, можешь - нет. Разве это не свобода выбора?

[quote]
Теперь представь, сколько работы надо будет переделать, чтобы реализовать работу "правильных" классов. Доделывать разбор заголовков классов, процедуру создания КОПов, да много чего еще. А вот вирт() и я() я сегодня добавил в ветку в репозитарии, изменив пяток строк в componentclass.cpp[/quote]
Да ладно тебе, нам же сроки никто не ставит. Ну, буду разбираться потихоньку.

И потом, декларатор отмены кеширования все равно надо делать.
И падение в CComponentClass:
[quote]
[I] EXH: Handled exception in CComponentClass::DecrRef(void) {1 occurrence}
Exception address: [KERNEL32.dll ip=0x67E41ACE]
Handler: CComponentClass::DecrRef(void) [ComponentClass.cpp:950]
}
catch(...) // artbear
{
=> }[/quote]
Все равно надо переделывать.

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

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #70 - 03. Июня 2006 :: 09:01
Печать  
orefkov писал(а) 03. Июня 2006 :: 08:37:
То есть из-за твоей любви к "чистым" принципам ООП я должен буду перелопачивать весь свой старый код?

Теперь представь, сколько работы надо будет переделать, чтобы реализовать работу "правильных" классов. Доделывать разбор заголовков классов, процедуру создания КОПов, да много чего еще. А вот вирт() и я() я сегодня добавил в ветку в репозитарии, изменив пяток строк в componentclass.cpp

Вижу печать в голосе. И Федор примерно теми же словами.
Да нет проблем,  давайте сделаем еще один метод для возврата правильной иерархии.
Только в суппорт меня не пишите, у меня здоровья не хватит. Подмигивание
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #71 - 04. Июня 2006 :: 20:44
Печать  
Функция вирт() - это хорошо. Давно надо было такую ввести. Только как к ней отнесется синтакс-контроль конфигуратора? Правда лучше было бы ноазвать ее Сам(). А еще лучше было бы сделать предопределенную переменную Сам.

И еще предлагаю написать тесты для тех случаев, которые хотелось бы решить. Тесты дадут возможность быстро обнаружить недостатки идей, которые возникают в головах.  Улыбка
По опыту: тесты легко модифицируются на ту или иную реализацию механизма, поэтому в качестве первого этапа достаточно написать тесты на текущей реализации методов работы с наследованием.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #72 - 05. Июня 2006 :: 04:51
Печать  
sedmin писал(а) 04. Июня 2006 :: 20:44:
Функция вирт() - это хорошо. Давно надо было такую ввести. Только как к ней отнесется синтакс-контроль конфигуратора? Правда лучше было бы ноазвать ее Сам(). А еще лучше было бы сделать предопределенную переменную Сам.

Если в глобальнике написать
Функция вирт() Экспорт КонецФункции
то нормально синтакс-контроль относится.
Конечно лучше такую функцию назвать Сам, только притомит везде исправлять Сам(Контекст) на Сам().
Сделать переменной - не знаю, надо разбираться,  с подсчетом ссылок, возможны косяки.
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #73 - 05. Июня 2006 :: 05:17
Печать  
orefkov писал(а) 05. Июня 2006 :: 04:51:
Конечно лучше такую функцию назвать Сам, только притомит везде исправлять Сам(Контекст) на Сам().


А разве нельзя в модуле переопределить функцию?

Кстати, многие уже пользуются таким вариантом:
Код
Выбрать все
Функция Конт(Конт) Возврат Конт; КонецФункции
Функция Сам() Возврат Конт(Контекст); КонецФункции 



Цитата:
Сделать переменной - не знаю, надо разбираться,  с подсчетом ссылок, возможны косяки.


Не переменной, а свойством. Типа
Код
Выбрать все
Функция Get_Сам()
    Возврат Сам();
КонецФункции 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 3 4 [5] 
ОтправитьПечать