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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #15 - 30. Мая 2006 :: 13:13
Печать  
Пусть есть иерархия А:Б:Ц

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

Теперь создаем класс Ц и ЗаменитьБазовыйОбъект() в классе Б начинает заменять экземпляр класса Б.

Проблема?
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #16 - 30. Мая 2006 :: 13:17
Печать  
kms писал(а) 30. Мая 2006 :: 13:13:
Теперь создаем класс Ц и ЗаменитьБазовыйОбъект() в классе Б начинает заменять экземпляр класса Б.

Проблема?


Угу. Проблема в том, что ты не читаешь того, что я пишу.

Цитата:
...тот класс, что был изначально создан через СоздатьОбъект().


10 минут медитаций.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #17 - 30. Мая 2006 :: 13:21
Печать  
kms писал(а) 30. Мая 2006 :: 13:13:
Класс Б написан так, что он использует ЗаменитьБазовыйОбъект() в предположении, что он заменяет экземпляр класса А.

А зачем классу "Б" может понадобится заменять экземпляр класса "А"? Я понимаю когда класс "Б" меняет свой экземпляр на экземпляр класса "А". А зачем нуна так как ты сказал?
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #18 - 30. Мая 2006 :: 13:37
Печать  
Цитата:
...тот класс, что был изначально создан через СоздатьОбъект().

Это какой в твоей интерпретации?

В моем примере через СоздатьОбъект() могут быть созданы все классы: и А, и Б, и Ц.
Соответственно, метод должен заменять для класса Ц экземпляры классов А или Б, а для класса Б - экземпляр класса А.

Цитата:
Я понимаю когда класс "Б" меняет свой экземпляр на экземпляр класса "А". А зачем нуна так как ты сказал?


Этой фразой ты отправил меня в глубокую задумчивость. Често, не понимаю, как класс "Б" может менять свой экземпляр на экземпляр совсем другого класса "А". Это же нарушит всю иерархию.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #19 - 30. Мая 2006 :: 13:50
Печать  
kms писал(а) 30. Мая 2006 :: 13:37:
Соответственно, метод должен заменять для класса Ц...

Метод должен заменять не для класса, а для объекта.

Цитата:
Цитата:
Я понимаю когда класс "Б" меняет свой экземпляр на экземпляр класса "А".


Этой фразой ты отправил меня в глубокую задумчивость. Често, не понимаю, как класс "Б" может менять свой экземпляр на экземпляр совсем другого класса "А". Это же нарушит всю иерархию.


Код
Выбрать все
Экземпляр_Б = СоздатьОбъект("Б");
Экземпляр_Б.ЗаменитьЭксзБазовогоКласса("А", ОбъектКласса_А);
 



Все правильно? Вопросов не возникает? Иерархия не нарушена?

Метод применяется к ОБЪЕКТУ. Конкретному объекту класса. Мы заменяем экземпляр данного конкретного объекта на экземпляр ДРУГОГО класса. И иерархии это не нарушает.

И я хочу, чтобы вне зависимости от того, где именно в иерархии располагается вызов метода ЗаменитьЭксзБазовогоКласса(), происходило именно это. Чтобы брался объект, созданный с помощью СоздатьОбъект() (а уж будет это "А", "Б" или "Ц" - нас не колышет), и именно этот объект подменялся на объект ДРУГОГО класса. Какого именно класса, и какой именно объект - будет указано в параметрах метода ЗаменитьЭксзБазовогоКласса().
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #20 - 30. Мая 2006 :: 14:02
Печать  
Цитата:
Метод должен заменять не для класса, а для объекта.

У тебя возникли вопросы насчет моего мнения по этому вопросу? Нерешительный

Цитата:
Я понимаю когда класс "Б" меняет свой экземпляр на экземпляр класса "А".
...
Экземпляр_Б = СоздатьОбъект("Б");
Экземпляр_Б.ЗаменитьЭксзБазовогоКласса("А", ОбъектКласса_А);

Имхо у тебя проблема с терминологией или с пониманием процесса.
То, что ты написал в первом и втором случае - это разные вещи.
В коде приведен пример замены экземпляра класса А на экземпляр класса А.

А никак не так, как ты написал. Класс Б свой экземпляр на класс А не меняет и не может этого сделать!

Цитата:
Метод применяется к ОБЪЕКТУ. Конкретному объекту класса. Мы заменяем экземпляр данного конкретного объекта на экземпляр ДРУГОГО класса. И иерархии это не нарушает.

Все же дело в отсутствии понимания, но при этом ты еще и кипятишься. Печаль
Мы заменяем экземпляр конкретного объекта на экземпляр ТОГО ЖЕ класса. Пойми, пожалуйста, никак не другого класса!

По последнему пункту сейчас еще раз напишу подробно.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #21 - 30. Мая 2006 :: 14:04
Печать  
kms писал(а) 30. Мая 2006 :: 14:02:
По последнему пункту сейчас еще раз напишу подробно.

Не надо, я понял.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #22 - 30. Мая 2006 :: 14:20
Печать  
Цитата:
То что ты предлагаешь - это решение для чисто абстрактных классов, т.е. классов, которые никогда сами по себе не могут быть созданы.

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


Приведи пример.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #23 - 30. Мая 2006 :: 14:23
Печать  
Прочитал все, что вы написали - ничего не понял Улыбка

Метод нужный и верный, пока у нас не будет конструкторов с параметрами.

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

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

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #24 - 30. Мая 2006 :: 14:30
Печать  
artbear писал(а) 30. Мая 2006 :: 14:23:
Прочитал все, что вы написали - ничего не понял Улыбка
[...]
Я этот метод использую в универсальных классах Справочников, Документов, когда класс определен как потомок класса Справочник, а инициализируется как объект конкретного справочника.

Аналогично. Только я попробовал вот эту свою инициализацию вынести в метод суперкласса.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #25 - 30. Мая 2006 :: 14:44
Печать  
fez писал(а) 30. Мая 2006 :: 14:20:
Цитата:
То что ты предлагаешь - это решение для чисто абстрактных классов, т.е. классов, которые никогда сами по себе не могут быть созданы.

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


Приведи пример.


ОК. На примере твоей иерархии, только Документы_СБухИтогами я тоже унаследую от Документ.РКО (для примера, это просто абстракция)
Код
Выбрать все
класс Документ_РКО = __Документ_РКО@MD : Документ.РКО,  Документы_СБухИтогами
{};

класс Документы_СБухИтогами = __Документы_СБИ@MD : Документ.РКО
{};
 



Код
Выбрать все
ДокСБИ = СоздатьОбъект("Документ_СБухИтогами");
ДокСБИ.Инит(__Конкретный_РКО);

Документ_СБухИтогами::Инит(__Конкретный_РКО)
{
ЗаменитьБазовыйОбъект("Документ.РКО", __Конкретный_РКО);
}
 



Т.е. Документ_СБухИтогами полагает, что он работает с конкретным объектом РКО.

Код
Выбрать все
ДокРКО = СоздатьОбъект("Документ_РКО");
ДокРКО.Инит(__Конкретный_РКО_2); // наследованный метод
 



Я утверждаю, что Инит() должен по-прежнему заменять базовый объект класса "Документы_СБухИтогами".

Ты предлагаешь заменять базовый объект класса "Документ_РКО".

Здесь 2 проблемы:
1. Код класса Документы_СБухИтогами начинает работать по-другому, это то, о чем я писал в самом начале. Это источник ошибок.
2. В принципе, Документы_СБухИтогами ничего не обязан знать о каких-то там наследниках. Это принципиально.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #26 - 30. Мая 2006 :: 14:53
Печать  
artbear писал(а) 30. Мая 2006 :: 14:23:
Метод нужный и верный, пока у нас не будет конструкторов с параметрами.

Ну да, это просто решение по достраиванию иерархии снизу вверх.
А по другому в существующей архитектуре, видимо, и не сделать.
Тут даже конструкторы с параметрами не помогут, все равно без замены объекта не обойтись.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #27 - 30. Мая 2006 :: 15:03
Печать  
kms писал(а) 30. Мая 2006 :: 14:44:
ОК. На примере твоей иерархии, только Документы_СБухИтогами я тоже унаследую от Документ.РКО (для примера, это просто абстракция)

Плохая абстракция. Зачем нам классу Документ_РКО два суперкласса Документ.РКО? Почему в таком случае нельзя наследовать Документ_РКО только от Документы_СБухИтогами?

Пока примера не понял, давай другой.

(бурчит под нос) Давайте теперь еще зациклим иерархию классов...
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #28 - 30. Мая 2006 :: 15:08
Печать  
kms писал(а) 30. Мая 2006 :: 14:53:
А по другому в существующей архитектуре, видимо, и не сделать.

Ну почему же? Можно еще вслед за Лешей Дирксом использовать агрегирование.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #29 - 30. Мая 2006 :: 15:08
Печать  
Цитата:
Плохая абстракция. Зачем нам классу Документ_РКО два суперкласса Документ.РКО? Почему в таком случае нельзя наследовать Документ_РКО только от Документы_СБухИтогами?


Да какая разница.
Ну давай унаследуем Документы_СБухИтогами от Справочник.Товары.
Что изменится?

ЗаменитьЭкзБазовогоКласса внутри Документы_СБухИтогами должен работать с иерархией класса Документы_СБухИтогами и ни с какой другой!

Он не должен ничего знать про Документ_РКО и про Документ.РКО, или это уже не ООП.
  

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