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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #15 - 17. Марта 2008 :: 06:11
Печать  
artbear писал(а) 16. Марта 2008 :: 11:50:
kms писал(а) 16. Марта 2008 :: 11:43:
Ну, не знаю, как вам понравится идея привязать проверку таких конфликтов даже не к проверке типов, а сделать новый отдельный режим проверки.
И для свойств, и для методов.

Для свойств понятно, что нужно.
А для методов вопрос - как ты отличишь подобную ошибку переопределения метода и виртуальный метод ?

Для Федора - для методов, как видишь, я сам сомневаюсь в возможности решения.
Для свойств вполне возможно, тут полиформизмом не пахнет Улыбка
  

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: ТП и ООП (проблема наследования или в чем дело
Ответ #16 - 17. Марта 2008 :: 07:36
Печать  
artbear писал(а) 17. Марта 2008 :: 06:11:
Для свойств вполне возможно, тут полиформизмом не пахнет Улыбка

А в чем принципиальное отличие переопределения свойства от переопределения метода?

Я с ходу могу утверждать, что у меня в конфигурации есть 2-3 места, где это используется.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #17 - 17. Марта 2008 :: 08:30
Печать  
fez писал(а) 17. Марта 2008 :: 07:36:
А в чем принципиальное отличие переопределения свойства от переопределения метода?

Отличие в сложности диагностики.
Вызываемый метод легко определить путем печати отладочных сообщений или непосредственной трассировкой в отладчике.
Принадлежность же свойства контексту определить сложно.

Вот, посмотри, как непросто дается поиск таких конфликтов даже в небольших иерархиях.
А если иерархия большая?
http://www.1cpp.ru/forum/YaBB.pl?num=1205656253/13#13

Цитата:
Я с ходу могу утверждать, что у меня в конфигурации есть 2-3 места, где это используется.

Расскажи поподробнее.
  

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: ТП и ООП (проблема наследования или в чем дело
Ответ #18 - 17. Марта 2008 :: 08:46
Печать  
kms писал(а) 17. Марта 2008 :: 08:30:
Цитата:
Я с ходу могу утверждать, что у меня в конфигурации есть 2-3 места, где это используется.

Расскажи поподробнее.

Есть два документа с общим функционалом.
Есть небольшие различия в этом функционале: в одном из документов есть реквизит, значение которого влияет на какой-нибудь Если внутри алгоритма.
В другом документе реквизита нет, но для алгоритма можно предположить, что он есть и всегда заполнен значением по умолчанию.

Для того, чтобы не дублировать код - выношу общий функционал в класс.
Чтобы не создавать в документе новый реквизит, и не заполнять его значением по умолчанию во всех базах - в классе создается публичное свойство того же имени, как и реквизит. В конструкторе реквизиту присваиваю значение по умолчанию. Ну вот и все, собственно.

Сначала наследуемся от Документ.ВидДокумента, так что если в документе есть реквизит - он найдется первым. Если нет реквизита - будет использовано свойство класса.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #19 - 17. Марта 2008 :: 08:50
Печать  
kms писал(а) 17. Марта 2008 :: 08:30:
fez писал(а) 17. Марта 2008 :: 07:36:
А в чем принципиальное отличие переопределения свойства от переопределения метода?

Отличие в сложности диагностики.

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #20 - 17. Марта 2008 :: 08:55
Печать  
fez писал(а) 17. Марта 2008 :: 08:46:
Сначала наследуемся от Документ.ВидДокумента, так что если в документе есть реквизит - он найдется первым. Если нет реквизита - будет использовано свойство класса.

Ну да, я себе примерно такую схему с конструированием иерархии из сущестувующих контекстов и представлял, конечно.

Тогда такой чуть параллельный вопрос.
Берем иерархию, в которой публичный реквизит базового класса переопределен публично же в подклассе.
В базовом классе (ну, например, в одном из методов базового класса) мы к какому свойству/реквизиту будем обращаться?
К свойству базового или "полиморфно" к свойству наследника?
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #21 - 17. Марта 2008 :: 09:01
Печать  
fez писал(а) 17. Марта 2008 :: 08:50:
полиморфизм бывает только у методов, а у свойств его быть не может.

Вот предыдущий вопрос как раз о реализации полиморфизма свойств в 1cpp.
Заодно, Федор, просвяти, как оно там, в питоне?

P.S.
Цитату я хорошо вырезал, правда? Подмигивание
  

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: ТП и ООП (проблема наследования или в чем дело
Ответ #22 - 17. Марта 2008 :: 09:06
Печать  
kms писал(а) 17. Марта 2008 :: 08:55:
Тогда такой чуть параллельный вопрос.
Берем иерархию, в которой публичный реквизит базового класса переопределен публично же в подклассе.
В базовом классе (ну, например, в одном из методов базового класса) мы к какому свойству/реквизиту будем обращаться?
К свойству базового или "полиморфно" к свойству наследника?

В теории конечно же должно обращаться "полиморфно" к свойству наследника. Как на самом деле обстоит дело в 1С++ я доверяю проверить тебе, а в питоне ща посмотрю.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #23 - 17. Марта 2008 :: 09:11
Печать  
kms писал(а) 17. Марта 2008 :: 09:01:
Заодно, Федор, просвяти, как оно там, в питоне?


Код
Выбрать все
class Base:
  def __init__(self):
    self.a = 0
  def method(self):
    print self.a

class Child(Base):
  def __init__(self):
    self.a = 1


B = Base()
B.method()

C = Child()
C.method()
 


печатает
0
1
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #24 - 17. Марта 2008 :: 09:48
Печать  
fez

Ну в общем, понятно.
Питонизированное ООП по самые небалуйки.

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

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #25 - 17. Марта 2008 :: 10:44
Печать  
kms писал(а) 17. Марта 2008 :: 08:55:
Берем иерархию, в которой публичный реквизит базового класса переопределен публично же в подклассе.
В базовом классе (ну, например, в одном из методов базового класса) мы к какому свойству/реквизиту будем обращаться?
К свойству базового или "полиморфно" к свойству наследника?

ИМХО насколько я знаю ООП в 1С++, именно "полиморфно" к свойству наследника.
Хотя 100% утверждать не могу, теста вроде такого не делал.
Вообще идея полиморфных свойств мне не очень нравится, ИМХО в этом случае проще создать спец. полиморфные методы для доступа к этим свойствам (как сделано в С++)
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #26 - 17. Марта 2008 :: 12:43
Печать  
Ну да, Артур, тут вот такая схема реализации ООП, питоноподобная.
Я бы ее окончательно раскритиковал, да Федор все ее к питону примеряет - а там так же Улыбка


Ну, с точки зрения ООП - она не правильная, ибо тут нарушения инкапсуляции на каждом шагу.
Наличие или отсутствие у базового класса наследника не должно влиять на инвариантное поведение самого базового класса - а оно влияет, ибо можно переопределить "полиморфное" свойство, и сделать его, к примеру, другим типом - и базовый класс получит проблемы при работе с этим свойством.
С++ позволяет скрывать имена свойств и методов (невиртуальных), но никакого полиморфизма в этом случае в базовом классе не возникает.
Инварианты класса остаются инвариантами... Должны оставаться - при нормальном дизайне.


Но тем не менее схема живая, рабочая, и даже довольно простая для понимания.
Кроме того, она не запрещает реализовывать нормальные иерархии, просто позволяет больше, чем хотелось бы с точки зрения стандартного ООП.

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

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 - 17. Марта 2008 :: 13:30
Печать  
kms писал(а) 17. Марта 2008 :: 12:43:
Я бы ее окончательно раскритиковал, да Федор все ее к питону примеряет - а там так же Улыбка


Ну а как же. А то привыкли к с++, и решили, что это единственный и неповторимый язык, и что реализация ООП в нем - единственно правильная и единственно возможная. А это не так Улыбка

Цитата:
Ну, с точки зрения ООП - она не правильная, ибо тут нарушения инкапсуляции на каждом шагу.
Наличие или отсутствие у базового класса наследника не должно влиять на инвариантное поведение самого базового класса - а оно влияет, ибо можно переопределить "полиморфное" свойство, и сделать его, к примеру, другим типом - и базовый класс получит проблемы при работе с этим свойством.

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

Цитата:
Кроме того, она не запрещает реализовывать нормальные иерархии, просто позволяет больше, чем хотелось бы с точки зрения стандартного ООП.
ООП, реализованного в с++, ты хотел сказать? Улыбка
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ТП и ООП (проблема наследования или в чем дело
Ответ #28 - 17. Марта 2008 :: 14:16
Печать  
Вот нравятца мне такие посиделки, как в старые добрые времена.

fez писал(а) 17. Марта 2008 :: 13:30:
ООП, реализованного в с++, ты хотел сказать? Улыбка


И то дело.
Надо договориться, что есть стандартное понимание ООП.
У Буча есть про полиморфизм свойств, как думаешь?

Цитата:
Цитата:
Ну, с точки зрения ООП - она не правильная, ибо тут нарушения инкапсуляции на каждом шагу.
Наличие или отсутствие у базового класса наследника не должно влиять на инвариантное поведение самого базового класса - а оно влияет, ибо можно переопределить "полиморфное" свойство, и сделать его, к примеру, другим типом - и базовый класс получит проблемы при работе с этим свойством.

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


Боюсь, тут не все так просто.
Если суперкласс даже объявит свое свойство приватным, а подкласс - переопределит публичным, боюсь сейчас суперкласс все равно получит публичное свойство подкласса.

Ну да ладно.
У меня есть предложение: а вот найди где-нибудь подтверждение обоснованности доступа из суперкласса в суперкласс, связанных только общим подклассом (в части публичных методов и свойств) и из суперкласса в подкласс (в части публичных "невиртуальных" методов и свойств) с точки зрения теории ООП.

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

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: ТП и ООП (проблема наследования или в чем дело
Ответ #29 - 17. Марта 2008 :: 14:25
Печать  
Цитата:
Боюсь, тут не все так просто.
Если суперкласс даже объявит свое свойство приватным, а подкласс - переопределит публичным, боюсь сейчас суперкласс все равно получит публичное свойство подкласса.

А тут в дело вступает синтаксис. Ибо к приватному свойству надо обращаться без Сам(Контекст), непосредственно по имени. А к публичному свойству подкласса ты иначе, чем через Сам(Контекст) и не подлезешь.
Так что именно в этом случае у тебя полная свобода выбора. К кому захочешь - к тому и обратишься.

Цитата:
с точки зрения теории ООП.

Я этта... консерваториев не заканчивал, умных книжек не читал. Ща куплю на деньги Альтерпласта книжку Буча - тогда отвечу, как оно, в теории.
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать