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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
ПолучитьТекущийОбъект()
02. Июня 2006 :: 08:40
Печать  

По следам ЗаменитьЭксзБазовогоКласса - 2.

А по поводу полиморфизма - так все очень просто.
У на явно не хватает механизма отсечения полиморфизма - вот это основная проблема.
И отсечения доступа к соседним суперклассам, кстати.

Для этого нужен метод получения текущего контекста без наследников.
Типа
Код
Выбрать все
_Сам = Сам.ПолучитьТекущийОбъект();
 


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

То же самое я могу делать для методов, которые у меня не являются полиморфными, но которые могут быть определены в наследниках.
Сейчас вместо метода текущего класса возможен вызов метода наследника через Сам(Контекст), если наследник определил вызываемый экспортный метод.
При добавлении наследников мой класс может начать работать неверно. Эта ситуация недопустима.
(я рассматриваю случай "нелегального" полиморфизма).

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

P.S. чуть орфографию исправил.
« Последняя редакция: 02. Июня 2006 :: 10:46 - kms »  

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


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

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

А, да, не сказал. Это предложение такое для внесения в 1с++ как один из механизмов усиления контроля и решения ситуаций повторного наследования. Такого метода пока нету.
« Последняя редакция: 02. Июня 2006 :: 10:46 - kms »  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #2 - 02. Июня 2006 :: 08:55
Печать  
Ой.
А еще ведь лучше будет отсекать каким-то методом все другие ветки, кроме той, в которой идет выполнение.
Тогда и полиморфизм будет работать, и ЗаменитьБазовыйОбъект() и ПолучитьБазовыйКласс() тоже.

Это лучший вариант?
« Последняя редакция: 02. Июня 2006 :: 10:47 - kms »  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #3 - 02. Июня 2006 :: 09:01
Печать  
Код
Выбрать все
Проведение			  Регистры				   Регистры
|					  |					    |
|				  Регистр_Товары			Регистр_Взаиморасчеты
|					  |					    |
---------------------------------------------------------------------
					   |
				    Док_Продажа
 


Т.е. находясь в классе Регистр_Взаиморасчеты нужно отсекать все контексты, кроме Регистры<- Регистр_Взаиморасчеты <- Док_Продажа.

И делать это нужно в лучшем случае - автоматически
В худшем - через вызов какого-то служебного метода.

Мы решим проблему и повторного наследования (ромбы) и полиморфизм не пострадает и доступ из суперкласса в суперкласс будет невозможен.

отредактировано:
P.S. Если делать автоматически - привет обратной совместимости.
Но делать можно - только флаг в настройки компоненты нужно добавить.

отредактировано 2:
Останется нарушение с доступом из суперкласса к членам (переменным) подкласса, но это уже цветочки.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #4 - 02. Июня 2006 :: 09:38
Печать  
Вот с этим я согласен, двумя руками за. Про это я и писал в последнем посте в старой ветке.

Только я не понял вот этого:
kms писал(а) 02. Июня 2006 :: 09:01:
Т.е. находясь в классе Регистр_Взаиморасчеты нужно отсекать все контексты, кроме Регистры<- Регистр_Взаиморасчеты <- Док_Продажа.

Как это можно НЕ отсечь Док_Продажа? Ты создашь объект, который пронаследован, но ущербно?

И следовательно, не понятно вот это:
Цитата:
И делать это нужно в лучшем случае - автоматически
В худшем - через вызов какого-то служебного метода.

... и доступ из суперкласса в суперкласс будет невозможен.

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #5 - 02. Июня 2006 :: 09:45
Печать  
Образно говоря, поиск методов нужно осуществлять только в тех подобъектах, до которых можно добраться из вызывающего контекста, спускаясь только вниз по дереву иерархии.
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #6 - 02. Июня 2006 :: 09:48
Печать  
orefkov писал(а) 02. Июня 2006 :: 09:45:
Образно говоря, поиск методов нужно осуществлять только в тех подобъектах, до которых можно добраться из вызывающего контекста, спускаясь только вниз по дереву иерархии.


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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #7 - 02. Июня 2006 :: 09:53
Печать  
orefkov писал(а) 02. Июня 2006 :: 09:45:
Образно говоря, поиск методов нужно осуществлять только в тех подобъектах, до которых можно добраться из вызывающего контекста, спускаясь только вниз по дереву иерархии.

Точно, добавлю только "спускаясь вниз по дереву иерархии таким путем, чтобы не пройти мимо текущего контекста выполнения".

sedmin
Ну ты-то должен понять, я был уверен, ты первым поймешь.

Если мы создаемРегистр_Взаиморасчеты как самостоятельный объект, то ни о каком Док_Продажа речи нет.
Но если мы вызываем метод класса Регистр_Взаиморасчеты из объекта Док_Продажа, тогда нам должны быть доступны публичные методы суперклассов, методы класса Регистр_Взаиморасчеты и методы класса Док_Продажа, реализующие виртуальные методы указанных суперклассов и реализующие полиморфное поведение.

В точности, как сказал orefkov.

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

    Но, согласись, уровень этих проблем - совсем другой.
  •   

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #8 - 02. Июня 2006 :: 09:55
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 09:48:
    Ведь потом можно вызвать виртуальный метод, который будет пользоваться как раз отсеченной функциональностью.  Озадачен


    Вот это как раз исключительно правильная реализация будет.
    Полностью соответствует концепции ООП.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #9 - 02. Июня 2006 :: 10:31
    Печать  
    Странно это как-то.

    Вот лежит у меня на столе Страуструп. Вот вечером еще раз прочитаю про dynamic_cast, тогда, надеюсь, ясно станет, как должно быть.

    Только не нравится мне автоматическое преобразование. Уж лучше пойти по пути Smalltalk - запрещать все на этапе компиляции.
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #10 - 02. Июня 2006 :: 10:38
    Печать  
    Не понял. Преобразование чего? Речь идет о поиске, этого достаточно.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #11 - 02. Июня 2006 :: 10:40
    Печать  
    kms писал(а) 02. Июня 2006 :: 09:53:
    sedmin
    Ну ты-то должен понять, я был уверен, ты первым поймешь.

    Если мы создаемРегистр_Взаиморасчеты как самостоятельный объект, то ни о каком Док_Продажа речи нет.
    Но если мы вызываем метод класса Регистр_Взаиморасчеты из объекта Док_Продажа, тогда нам должны быть доступны публичные методы суперклассов, методы класса Регистр_Взаиморасчеты и методы класса Док_Продажа, реализующие виртуальные методы указанных суперклассов и реализующие полиморфное поведение.

    В точности, как сказал orefkov.

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

    Но, согласись, уровень этих проблем - совсем другой.


  • Да какой другой. Это все про то же самое.

    Ответь на простой вопрос:
    Что будет выдавать ТипЗначенияСтр(Сам.ПолучитьТекущийОбъект())?

    И еще на один вопрос, посложнее:
    Что будет выдавать ТипЗначенияСтр(Сам()), если его вызвать из виртуального метода наследника, если в родителе была выполнена строка Сам.ПолучитьТекущийОбъект.ВиртуальныйМетод()?
      
    Наверх
     
    IP записан
     
    sedmin
    1c++ developer
    Отсутствует


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #12 - 02. Июня 2006 :: 10:40
    Печать  
    kms писал(а) 02. Июня 2006 :: 09:53:
    sedmin
    Ну ты-то должен понять, я был уверен, ты первым поймешь.

    Если мы создаемРегистр_Взаиморасчеты как самостоятельный объект, то ни о каком Док_Продажа речи нет.
    Но если мы вызываем метод класса Регистр_Взаиморасчеты из объекта Док_Продажа, тогда нам должны быть доступны публичные методы суперклассов, методы класса Регистр_Взаиморасчеты и методы класса Док_Продажа, реализующие виртуальные методы указанных суперклассов и реализующие полиморфное поведение.

    В точности, как сказал orefkov.

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

    Но, согласись, уровень этих проблем - совсем другой.


  • Да какой другой. Это все про то же самое.

    Ответь на простой вопрос:
    Что будет выдавать ТипЗначенияСтр(Сам.ПолучитьТекущийОбъект())?

    И еще на один вопрос, посложнее:
    Что будет выдавать ТипЗначенияСтр(Сам()), если его вызвать из виртуального метода наследника, если в родителе была выполнена строка Сам.ПолучитьТекущийОбъект().ВиртуальныйМетод()?
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #13 - 02. Июня 2006 :: 10:43
    Печать  
    orefkov писал(а) 02. Июня 2006 :: 09:45:
    Образно говоря, поиск методов нужно осуществлять только в тех подобъектах, до которых можно добраться из вызывающего контекста, спускаясь только вниз по дереву иерархии.


    Цитата:
    Остается 2 проблемы:

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


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

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

    чуть отредактировал
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #14 - 02. Июня 2006 :: 10:46
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 10:40:
    Ответь на простой вопрос:
    Что будет выдавать ТипЗначенияСтр(Сам.ПолучитьТекущийОбъект())?

    И еще на один вопрос, посложнее:
    Что будет выдавать ТипЗначенияСтр(Сам()), если его вызвать из виртуального метода наследника, если в родителе была выполнена строка Сам.ПолучитьТекущийОбъект().ВиртуальныйМетод()?

    sedmin, не тормози! сникерсни!

    Никаких ПолучитьТекущийОбъект() не будет, смотри все, начиная с поста 2 (который начинается с Ой).

    P.S.
    Первый пост зачеркиваю.
      

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