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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #75 - 30. Мая 2006 :: 17:25
Печать  
Вот код на С++:
Цитата:
class base
{
public:
     virtual void meth() = 0 {};
     void test() {meth();};
};

class child : public base
{
public:
     virtual void meth() {Msg("child");}
};

funcTest()
{
  child c;
  c.meth();
  c.test();
}

Печатает, понятное дело, "child", "child".

Всего лишь одно отличие:
Метод meth() чисто виртуальный. А класс base - чисто абстрактный класс.
Соответственно, контроль ошибок - реальный, а не призрачный.

С++ эталон? Не знаю. Но то, что ты написал на питоне - это ужасно.
Впрочем, если тебе не важна правда и ты хочешь остаться при своих - пожалуйста. Нерешительный

P.S.
Код, который ты продемонстрировал - крайне небезопасный. Более того, в 1С ты это можешь отследить исключительно на этапе выполнения.
Я такой код не поддерживаю и поддерживать кого-либо (даже тебя!) в его использовании не собираюсь.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #76 - 30. Мая 2006 :: 17:47
Печать  
Если это тебя не убеждает, вот примеры ошибок на этапе компиляции:

Попытка создания класса base:
Код
Выбрать все
base b;

error C2259: 'base' : cannot instantiate abstract class due to following members:
warning C4259: 'void __thiscall base::meth(void)' : pure virtual function was not defined
 



Попытка создания класса, не определяющего чисто виртуальные функции:
Код
Выбрать все
class child2 : public base
{
public:
	void ch2() {Msg("ch2");};
	   // метод meth() не определен
};
child2 c2;

error C2259: 'child2' : cannot instantiate abstract class due to following members:
warning C4259: 'void __thiscall base::meth(void)' : pure virtual function was not defined
 


Как ты такой контроль реализуешь в 1С/1CPP ты подумал?
Почувствуйте разницу, блин.

Федор, что-то ты перевел меня в состояние повышенной боевой готовности.
Если бы ты был не Федором Езеевым и практически боевым товарищем, а, скажем, кирюхой с итланда, я бы на тебя щас конкретно наехал. Класс
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #77 - 30. Мая 2006 :: 18:59
Печать  
И, напоследок, загляни вот сюда: http://skipy.dev.juga.ru/philosophy/inheritance.html
Не ты ли эту ссылку давал? Или это Палыч был?

Отлично написано, лучше не скажешь.
Прочитай про наследование реализации и наследование интерфейсов, как это сделано в java (в С++ так же).
Если ты поймешь, почему так сделано, у тебя не останется вопросов в отношении того, как должна работать замена базовых объектов в 1cpp.
И почему метод (Проведен()?) или свойство (Фирма?) наследника, которые видны в базовом классе без явного определения интерфейса - это плохо.

Очень, очень плохо. Злой

P.S.
И твоя ошибка в том, что ты путаешь наследование реализации (а в 1С/1cpp это именно так) с наследованием интерфейсов.
При этом не имея никакого желания интерфейс этот определять и забивая болт на понятие инкапсуляции вообще. Печаль
  

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


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #78 - 31. Мая 2006 :: 03:26
Печать  
Ну... Вы, блин, даете...  Ужас
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #79 - 31. Мая 2006 :: 06:41
Печать  
DrACe писал(а) 31. Мая 2006 :: 03:26:
Ну... Вы, блин, даете...  Ужас

Да уж. Тема вызвала прилив сил Улыбка
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #80 - 31. Мая 2006 :: 06:58
Печать  
Федор
Поскольку реально меня вопрос заинтересовал, я вчера и правда взялся за Буча, Страуструпа и даже Айру Пол посмотрел.
И знаешь, я придумал, как сформулировать вопрос, чтобы он был простым и очевидным.

Вот смотри: у тебя граф иерархии:
Код
Выбрать все
Документ.РКО <-- Документ_РКО --> Документы_СБИ
 



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

Если помнишь, началось все вот с этого:
Цитата:
Вот беру я мою иерархию. И в код класса Документы_СБухИтогами (который у меня сам по себе, и ни от кого не наследуется) вставляю вызов Сам(Контекст).Вид().
И не смотря на то, что класс Документы_СБухИтогами ничего не знает об иерархии класса Документ_РКО - этот вызов нормально отрабатывает и делает именно то, что мне нужно.

И называется это полиморфизм.

Почему же когда я хочу добиться подобного поведения не от метода Вид(), а от метода ЗаменитьЭксзБазовогоКласса() - это уже становится не ООП?

Потом было это:
Цитата:
Так вот, когда такое делаешь - реальной замены базового класса не происходит. То есть если в тот же самый __Инит__ следующими строчками вставить

Сообщить(""""+КонтекстДокумента.Фирма+"""");
Сообщить(""""+Сам(Контекст).Фирма+"""");

то будет написано

"ООО Альтерпласт"
""

Вот здесь давай попробуем ответить себе, что ты пытаешься сделать.
Ты пытаешься обратиться в одном базовом классе к методам и свойствам другого базового класса.
Ты это называешь полиморфизмом.
Если ты отстаивиешь свою точку зрения, обоснуй, на каких коцепциях ООП ты основываешь свое утверждение.
Утверждение, что обращение из одного суперкласса к методам и членам другого суперкласса законно и является полиморфизмом.
Я бы хотел увидеть ссылку на авторитетный первоисточник, твоего мнения здесь недостаточно.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #81 - 31. Мая 2006 :: 07:12
Печать  
В отношении ЗаменитьЭксзБазовогоКласса().

Это не виртуальная функция. Да, она определена для каждого класса.
Но это не виртуальная функция. Это, если хочешь, служебная функция.
Она нужна исключительно для конструирования иерархии в 1С.

Ее поведение должно быть детерминировано и здесь я против какого бы то ни было полиморфизма.

Я уже объяснял почему.
Если ты переопределил любую функцию в подклассе, проблемы не будет.
Ну возвращал у тебя Вид() "Круг", стал возвращать "Квадрат" какие проблемы?
"Переопределение" же ЗаменитьЗксзБазовогоКласса в корне изменит поведение суперкласса, если тот полагается на определенную работу ЗаменитьЭксзБазовогоКласса().

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

Короче, без поддержки абстрактных классов, я конкретно против виртуализации ЗаменитьЭксзБазовогоКласса().
А вот не сделать ли поддержку абстрактных классов - это вопрос, над которым нужно подумать.

Здесь я вижу одну проблему: контроль ошибок на этапе компиляции будет невозможен.
Т.е. мы добавим себе работы по контролю обязательного определения чисто виртуальных методов на этапе выполнения.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #82 - 31. Мая 2006 :: 09:43
Печать  
Вынесу-ка я сюда резюме. Вдруг кто-то присоединится к нашей дискуссии.

Цитата:
Вкратце:
1. Считаю возможным перегрузку ЗаменитьБазовыйОбъект() только для абстрактных (интерфейсных) классов.
Для этого их и нужно сперва создать в 1cpp.

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

3. Считаю невозможным и некорректным использование свойств подкласса в суперклассе.

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

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #83 - 31. Мая 2006 :: 11:32
Печать  
kms писал(а) 31. Мая 2006 :: 09:43:
Вынесу-ка я сюда резюме. Вдруг кто-то присоединится к нашей дискуссии.


Вы были правы, доктор. Признаю себя ослом и жду дальнейших распоряжений. (с) мультик "Остров сокровищ".
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #84 - 31. Мая 2006 :: 12:33
Печать  
Блин, как красиво ты закрыл тему! Выражаю свое восхищение. Улыбка
Продолжаем поиск сокровищ. Подмигивание
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #85 - 31. Мая 2006 :: 14:17
Печать  
В целом я согласен с вынесенным вердиктом.

Но все же остается пара моментов:

1. Что будет возвращать ТипЗначенияСтр(Сам(Контекст)), если ее написать в модуле Документы_СБухИтогами?
Если "Документ_РКО", то почему вызов Сам(Контекст).ЗаменитьБазовыйОбъект(НовыйОбъект) работает не так, как ожидалось?

2. Относительно виртуальных методов. Надо признать, что в скриптовых языках, таких, например, как Питон, все методы являются виртуальными. Это только с строгих языках, таких как С++ и Ява введены механизмы, которые позволят отслеживать подобные вещи. Язык 1С и 1С++ (не надо лукавить) надо отнести к нестрогим скриптовым языкам.
И надо оставить в отношении виртуальных методов все как есть, и не считать их появление и использование багом.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #86 - 31. Мая 2006 :: 14:24
Печать  
sedmin писал(а) 31. Мая 2006 :: 14:17:
1. Что будет возвращать ТипЗначенияСтр(Сам(Контекст)), если ее написать в модуле Документы_СБухИтогами?

Ну тут все просто, будет результат "Документы_СБухИтогами"

Сам в себе усомнился, проверил, убедился, что неправ.
Вернется именно тип значения реального объекта, т.е. имя класса реального объекта, т.е. "Документ_РКО"
ЗЫ юнит-тесты как обычно помогли
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #87 - 31. Мая 2006 :: 14:45
Печать  
В чем тогда разница в результате вызова Сам(Контекст) в модулях Документы_СБухИтогами и Документ_РКО?
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

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


ВОТ !!! ВОТ !!! Именно это я и пытался выяснить... А в ответ был обкидан какаш анреспектами.

То есть на вопрос: почему у нас все методы у класса виртуальны, а ЗаменитьЭксзБазовогоКласса - нет, я в ответ получил "а нечего пользоваться виртуальностью методов - это моветон".
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #89 - 31. Мая 2006 :: 14:59
Печать  
sedmin
Тут у меня мнение совпадает с мнением Артура (зачеркнутым).

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

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

Здесь надо продумать реализацию RTTI, возможно как раз ТипЗначенияСтр() мы и будем использовать как основу RTTI - тогда это также особый случай, который никак не влияет на наше решение по остальным служебным функциям.

Цитата:
2. Относительно виртуальных методов. Надо признать, что в скриптовых языках, таких, например, как Питон, все методы являются виртуальными. Это только с строгих языках, таких как С++ и Ява введены механизмы, которые позволят отслеживать подобные вещи. Язык 1С и 1С++ (не надо лукавить) надо отнести к нестрогим скриптовым языкам.  
И надо оставить в отношении виртуальных методов все как есть, и не считать их появление и использование багом.

До появления 1CPP 1С был чисто объектным и братья Нуралиевы на семинарах задавали сакраментальные вопросы типа "ну, давайте, расскажите нам, что такое ООП и зачем оно вам нужно".
Сейчас мы имеем первичную реализации логики ООП, которая имеет определенные нарушения принципов ООП.
Другое дело, что мы привыкли к этой логике и готовы ее защищать. Потому что это удобно.
В этом есть здравый смысл. Вообще, по концепции ООП и эффективности ее конкретной реализации можно ведь говорить долго.
Меня, если честно, до сих пор поражает список литературы, приведенный Бучем в его книге. Там примерно 50 листов.

Однако дело не в механизмах, которые введены в С++ (С++, кстати, гибок именно за счет позднего связывания), а в нашем решении.
Мы можем сделать проще (хоть вообще все классы в один контекст объединим с произвольным доступом к методам и свойствам).
Мы можем приблизиться к классической схеме ООП и механизмы контроля мы можем обеспечить не хуже, чем в С++.
Правда, только на этапе выполнения.

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

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