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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПолучитьТекущийОбъект()
Ответ #30 - 02. Июня 2006 :: 12:08
Печать  
kms писал(а) 02. Июня 2006 :: 12:02:
Понял? Оцени красоту идеи.

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

Мое предложение вот в чем: давайте дадим разработчику приложения свободу выбора. Захочет - воспользуется старым механизмом поиска метода в иерархии (вызвав метод через Сам(Контекст)). Захочет - воспользуется твоим новым поиском с помощью некоторого нового метода Сам(Контекст).ПолучитьТекущуюВеткуИерархии().
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПолучитьТекущийОбъект()
Ответ #31 - 02. Июня 2006 :: 12:10
Печать  
sedmin писал(а) 02. Июня 2006 :: 12:05:
fez писал(а) 02. Июня 2006 :: 11:45:
Цитата:
При ПолучитьТекущийКласс() тоже остаются проблемы.

Какие?


Сначала ты ответь на вопрос: Что вернет ТипЗначенияСтр(Сам().ПолучитьТекущийКласс()), если его вызвать в родителе? "Родитель" или "Потомок"?


"Родитель". Ну то есть мне бы хотелось, чтобы так было.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПолучитьТекущийОбъект()
Ответ #32 - 02. Июня 2006 :: 12:11
Печать  
kms писал(а) 02. Июня 2006 :: 12:07:

sedmin

Завязывай с некорректными вопросами.
Я же сказал, никаких ПолучитьТекущийКласс() не будет.
Врубись, пожалуйста, и не будем обсуждать то, чего нет!


Эта. Не рви мне шаблон, пожалуйста. И седмину тоже Улыбка
Сегодня моя очередь оффтопить в твоей ветке.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #33 - 02. Июня 2006 :: 12:11
Печать  
kms писал(а) 02. Июня 2006 :: 12:02:
Понял? Оцени красоту идеи.


Будут разные результаты работы одного и того же метода потомка в зависимости от стека вызовов.
Наверное, правильно сделать так, чтобы методы текущего родителя былы лишь БОЛЕЕ ПРИОРИТЕТНЫ, чем методы другого родителя. Иначе потомок совсем не сможет вызватьв виртуальных методах НИКАКИХ методов других родителей.

ОФФ: Почему здась такой хреновый радактор? Без откатов и т.д.?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #34 - 02. Июня 2006 :: 12:12
Печать  
fez писал(а) 02. Июня 2006 :: 12:11:
kms писал(а) 02. Июня 2006 :: 12:07:

sedmin

Завязывай с некорректными вопросами.
Я же сказал, никаких ПолучитьТекущийКласс() не будет.
Врубись, пожалуйста, и не будем обсуждать то, чего нет!


Эта. Не рви мне шаблон, пожалуйста. И седмину тоже Улыбка
Сегодня моя очередь оффтопить в твоей ветке.

Черт рыжий. Ладно, оффтопь. Смех
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #35 - 02. Июня 2006 :: 12:15
Печать  
fez писал(а) 02. Июня 2006 :: 12:10:
sedmin писал(а) 02. Июня 2006 :: 12:05:
fez писал(а) 02. Июня 2006 :: 11:45:
Цитата:
При ПолучитьТекущийКласс() тоже остаются проблемы.

Какие?


Сначала ты ответь на вопрос: Что вернет ТипЗначенияСтр(Сам().ПолучитьТекущийКласс()), если его вызвать в родителе? "Родитель" или "Потомок"?


"Родитель". Ну то есть мне бы хотелось, чтобы так было.


Вот с этим я согласен. И тогда ему не доступны никакие методы потомков. И тогда этот объект обрезан со всех сторон и у него нет никаких потомков.  Так я согласен.

Пусть у себя меняет каких хочет родителей, и вообще, делает что хочет.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #36 - 02. Июня 2006 :: 12:21
Печать  
Отвечу обоим сразу.

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

Ну нельзя этого делать, пойми, пожалуйста. Нельзя.
Если тебе нужны конкретные данные из подкласса - пользуйся полиморфными функциями.
Определяй интерфейс в супере и получай данные из переопределенного метода подкласса.
Это будет правильно.
Нужны тебе данные документа - вызови метод подкласса - наследника РКО, заполни тз и верни ее в суперкласс.
И делай с ними, что хочешь. И это будет правильно.

Цитата:
Будут разные результаты работы одного и того же метода потомка в зависимости от стека вызовов.

Не будут.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #37 - 02. Июня 2006 :: 12:28
Печать  
kms писал(а) 02. Июня 2006 :: 12:21:
Цитата:
Будут разные результаты работы одного и того же метода потомка в зависимости от стека вызовов.

Не будут.


Вот такой код:

Процедура ВиртуальныйМетод() Экспорт
  Метод_ПервогоРодителя();
  Метод_ВторогоРодитея();
КонецПроцедуры

И как он себя поведет при вызовах из текущего модуля и при вызовах из модуля ПервогоРодителя через Сам().ВиртуальныйМетод()?

Или после того, как вызов пройдет Сам() нормализуется (в твоем первом варианте)?

А если Сам() не портится, то стек вызовов не будет влиять на работу ВиртуальногоМетода (в твоем втором варианте)?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #38 - 02. Июня 2006 :: 12:29
Печать  
sedmin писал(а) 02. Июня 2006 :: 12:15:
"Родитель". Ну то есть мне бы хотелось, чтобы так было.


Цитата:
Вот с этим я согласен. И тогда ему не доступны никакие методы потомков. И тогда этот объект обрезан со всех сторон и у него нет никаких потомков.  Так я согласен.

Пусть у себя меняет каких хочет родителей, и вообще, делает что хочет.


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

Родители, кстати, (объекты суперклассов, ты это имел в виду?), у обрезанного и необрезанного общие будут.
Т.е. заменив в одном месте, заменишь и в другом. Это же один объект, независимо от преобразований.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #39 - 02. Июня 2006 :: 12:33
Печать  
kms писал(а) 02. Июня 2006 :: 12:29:
Родители, кстати, (объекты суперклассов, ты это имел в виду?), у обрезанного и необрезанного общие будут.
Т.е. заменив в одном месте, заменишь и в другом. Это же один объект, независимо от преобразований.


То есть добъешься одинакового (неполиморфного) поведения нужных методов.
То есть ЗаменитьБазовыйОбъект() после этого всегда будет работать одинаково.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #40 - 02. Июня 2006 :: 12:36
Печать  
sedmin писал(а) 02. Июня 2006 :: 12:28:
Вот такой код:

Процедура ВиртуальныйМетод() Экспорт
  Метод_ПервогоРодителя();
  Метод_ВторогоРодитея();
КонецПроцедуры

И как он себя поведет при вызовах из текущего модуля и при вызовах из модуля ПервогоРодителя через Сам().ВиртуальныйМетод()?

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

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

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #41 - 02. Июня 2006 :: 12:38
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 12:33:
    То есть добъешься одинакового (неполиморфного) поведения нужных методов.
    То есть ЗаменитьБазовыйОбъект() после этого всегда будет работать одинаково.

    Ну да, я тебя понял. Я ведь с этого начал. Кроме того, ты тоже вчера это предлагал.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #42 - 02. Июня 2006 :: 12:41
    Печать  
    Выглядит заманчиво. Но чувствую, что где-то лежат грабли.
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #43 - 02. Июня 2006 :: 12:42
    Печать  
    Думай. Если найдешь, скажи мне.
    Но помни: обходя грабли ты теряешь драгоценный опыт!  Смех
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #44 - 02. Июня 2006 :: 12:44
    Печать  
    Продублирую, а то если кто с конца читает ветки, так им неудобно в начало смотреть:

    orefkov писал(а) 02. Июня 2006 :: 09:45:
    Образно говоря, поиск методов нужно осуществлять только в тех подобъектах, до которых можно добраться из вызывающего контекста, спускаясь только вниз по дереву иерархии.


    Цитата:
    Остается 2 проблемы:
    1. возможность вызова методов подкласса без объявления интерфейса в суперклассах
    2. доступ к свойствам подкласса из суперклассов


    А эти проблемы - проще не придумаешь. Решения:

    1. поиск методов вести только среди виртуальных, определенных в текущем контексте исполнения (с учетом интерфейсов суперклассов) - т.е. только в пределах интерфейса текущего контекста.
    2. поиск свойств вести только от текущего контекста исполнения вниз.
      

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 
    ОтправитьПечать