Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) обращение из одного суперкласса к методам другого (число прочтений - 15536 )
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #15 - 01. Июня 2006 :: 11:44
Печать  
kms писал(а) 01. Июня 2006 :: 11:38:
Проблемы 2:
1. Проблема реализации, которая по умолчанию позволяет это делать.
2. Проблема квалификации кадров, котроые пользуются такой реализацией и пребывают в счастливом неведении.

Исправляя первую проблему, ты наткнешся на жестокое сопротивления второй Улыбка

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #16 - 01. Июня 2006 :: 11:45
Печать  
orefkov писал(а) 01. Июня 2006 :: 11:40:
Вопрос только kms.
Почему у тебя возникла эта тема в ответ на мой пример в ветке про ЗаменитьЭкземпляр?
В том примере как раз такого поведения не было.

Саня, все было и про это и про
Цитата:
Исправляя первую проблему, ты наткнешся на жестокое сопротивления второй

Просто тема большая, как ты сказал "многа буков", понимаешь?
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #17 - 01. Июня 2006 :: 13:48
Печать  
orefkov
Цитата:
У меня много было мыслей по грамотной реализации ООП с учетом накопленного в 1С++ опыта.
Однако все они упирались в "обратную совместимость".

Дык я понимаю, что ты давно этой темой занимаешься и текущей реализацией владеешь.
Если будешь делиться идеями, мне будет интересно.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #18 - 01. Июня 2006 :: 15:31
Печать  
orefkov
И еще прошу высказаться вот по этому вопросу (из пред. ветки).
Если честно, мне твое мнение важно.

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

Типа
Цитата:
// создание шаблона
// возьмем за основу пример Федора
Класс = СоздатьКласс("Документ.РКО"); // создание класса

// конструирование
Класс.ДобавитьСуперкласс("Документы_СБИ", ""); // имя класса, уровень иерархии

// переопределение виртуальных функций
Класс.ДобавитьПодкласс("Документ_РКО", ""); // имя класса, уровень иерархии

Если ПризнакУчета = "НафНаф" Тогда

   // переопределение виртуальных функций подкласса
   Сам.ДобавитьПодкласс("Документы_РКО_УчетНафНаф", "Документ_РКО");

КонецЕсли;

// инстанциирование объекта
Сам = Класс.СоздатьОбъект(...); // вызов конструкторов в соотв. с иерархией
Сам.ЗаменитьБазовыйОбъект("Документ.РКО", "Контекст"); // встраивание объекта


Т.е. мы имеем возможность динамического  конструирования иерархии с учетом необходимых суперклассов и подклассов + возможность инстанциирования описанных объектов.

  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #19 - 01. Июня 2006 :: 16:54
Печать  
Хм. Хотя множественные наследники - это новое слово в теории ООП Улыбка
Интересно, а по этой теме есть какая-либо авторитетная литература?
  

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: обращение из одного суперкласса к методам друг
Ответ #20 - 01. Июня 2006 :: 17:20
Печать  
kms писал(а) 01. Июня 2006 :: 16:54:
Хм. Хотя множественные наследники - это новое слово в теории ООП Улыбка

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #21 - 01. Июня 2006 :: 17:44
Печать  
fez
Да, новые идеи всегда с трудом находят понимание у современников Печаль

Что такое множественное наследование, ты понимаешь.
Теперь переверни картинку вверх ногами. Что получилось?
Это множественные наследники.

В предлагаемой реализации:
Цитата:
класс А
{
   virtual test1(Msg("A::test1"));
   virtual test2(Msg("A::test2"));
};

класс mix1
{
   virtual test1(Msg("mix1::test1"));
}

класс mix2
{
   virtual test2(Msg("mix2::test2"));
}


Теперь замещаем методы test1 и test2 методами классов mix1 и mix2:
Цитата:
класс = СоздатьКласс("А");
класс.ДобавитьПодкласс("mix1");
класс.ДобавитьПодкласс("mix2");

Сам = класс.СоздатьОбъект();
Сам.test1();
Сам.test2();


Поскольку оба методы переопределены, причем разными подклассами, результат будет:
Цитата:
mix1::test1
mix2::test2

Врубаешься теперь в концепцию? В ней сила.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #22 - 01. Июня 2006 :: 17:46
Печать  
Только это не наследование!

Как я только что обнаружил, это так называемые "примеси", "mixin". И то, видимо, не совсем.
Но я работаю над этим.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #23 - 01. Июня 2006 :: 17:53
Печать  
Опять же читаю Буча, ну нравится он мне.

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


Вот так.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #24 - 01. Июня 2006 :: 17:59
Печать  
Только у Буча примеси - это скорее набор абстрактных классов для множественного наследования от них.
Хотя описание вполне могло бы мне подойти. То есть описание как раз подходит 100%.

У меня именно не отношения обобществления/специализации - это не наследование.
У меня не отношения целого и части - это не агрегация.
У меня именно уточнение конкретных поведенческих моментов.

Т.е. именно уточнение, а не реализация как у примесей.
Ну не может быть, чтобы эта концепция еще не была где-то реализована. Буду искать.
  

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: обращение из одного суперкласса к методам друг
Ответ #25 - 01. Июня 2006 :: 18:03
Печать  
mixin... fixin... ну это так, музыкой навеяло... не к ночи.

Ну. Агрегирование. Да. И что?
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #26 - 01. Июня 2006 :: 18:06
Печать  
fez писал(а) 01. Июня 2006 :: 18:03:
mixin... fixin... ну это так, музыкой навеяло... не к ночи.

Ну. Агрегирование. Да. И что?

Где агрегирование? Где ты видишь отношения целого и части?
И что значит к ночи, ты еще на работе должен быть.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #27 - 01. Июня 2006 :: 18:22
Печать  
Впрочем ладно, ну, нах#р, надо жить по средствам.

Буду делать агрегированием делегата, видимо это наилучший вариант.
Делегат я переписал, он сейчас быстрый, гибкий и стабильный.

Этот делегат вполне можно считать частью целого, выражающего особенности его поведения.
Согласен называть это агрегированием.

Тему фтопку. Улыбка


Блин, я так и хотел сразу делать, да Федор, редиска - нехороший человек, меня со своими заменами экcземпляров заморочил. Смех
  

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: обращение из одного суперкласса к методам друг
Ответ #28 - 02. Июня 2006 :: 03:30
Печать  
Цитата:
класс = СоздатьКласс("А");
класс.ДобавитьПодкласс("mix1");
класс.ДобавитьПодкласс("mix2");

Сам = класс.СоздатьОбъект();
Сам.test1();
Сам.test2();

Как ты ловко создал свой синтаксис.

Если "ДобавитьПодкласс()" - это агрегирование, то ты в своих выводах не прав.
Если это ты так наследование показал, то нужно уточнить экземпляр какого класса ты тут пораждаешь: Сам = класс.СоздатьОбъект(ВОТ_ТУТ_ЧТО); - не честно так пользоваться!

Подкорректирую чутк сообщение: а каков смысл примесей вообще, т.е. как они повлияют на поведение класса?
И как ими пользоваться?
« Последняя редакция: 02. Июня 2006 :: 05:28 - spock »  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: обращение из одного суперкласса к методам друг
Ответ #29 - 02. Июня 2006 :: 08:13
Печать  
Щас проблему еще раз нарисую.

Вот есть у меня в конечной иерархии класс симуляции жизнедеятельности "жуки"
Я их в общих чертах описал, ну и пользуюсь.

Теперь я понимаю, что
  • некоторые жуки не летают, а прыгают
  • некоторые жуки не жужжат, а свистят
  • некоторые жуки ночью не спят, а играют на рояле
  • некоторые жуки дают молоко

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

    2. дефолтная реализация интерфейса - по умолчанию жук ночью спит, а днем летает

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

    1. Наследование: Жук <- Жук летающий; Жук <- Жук свистящий и т.д
    С точки зрения ООП все в полном порядке.
    Но как быть с жуком прыгающим, свистящим и дающим молоко? А если признаков - сотня? Какая у меня будет иерархия классов?

    2. Агрегация: У жука есть: крылья - 2 шт., звуковой сигнал - свисток - 1 шт, музыкальный инструмент рояль - 1 шт., производственный цикл - 1 шт.
    В принципе, реализуемо. Но я хочу описывать _поведение_  жуков, а не составные части.
    Попробуйте описать человека в терминах агрегации, что получится?

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

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

    Вот я вышел на балкон и поймал жука. Взял микроскоп и рассмотрел его со всех сторон.
    Я его идентифицировал как неизвестного. Изучил его аспекты поведения.
    Теперь я беру свой общий класс жуков и список примесей и по списку ставлю галки:
  • летает
  • лает
  • ест овес

    Получается полностью описанный жук, с полностью реализованными аспектами поведения.
    И тут вопрос - как это сделать красиво и с минимальными затратами.

    последний ответ перенес в новую тему
    http://www.1cpp.ru/forum/YaBB.pl?num=1149236367
  •   

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