Наследование

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Наследование

Сообщение d3drm » 21.12.2007 (Пт) 13:43

Либо я что-то упустил в своем развитии, либо преподы МИФИ наелись каких-то грибов, но тем не менее есть один зачетный вопрос, который у меня, по меньшей мере, вызывает недоумение... Итак, вопрос (в экзаменационной форме, без вопросительных знаков):

Возможность определения новых объектов на основе уже существующего объекта более высокого уровня путем передачи им значений некоторых свойств этого объекта. Понятие наследования. Пример наследования в среде проектирования и программирования Windows-приложений Visual Basic.


Прокоментируйте, господа...
ХЎ

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.12.2007 (Пт) 13:50

А что именно комментировать?
Синтаксических конструкций нет. Но их можно сделать самостоятельно.
Кроме того, скорее всего речь идет о VB.NET.
Lasciate ogni speranza, voi ch'entrate.

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Re: Наследование

Сообщение BION » 21.12.2007 (Пт) 13:52

d3drm писал(а):Либо я что-то упустил в своем развитии, либо преподы МИФИ наелись каких-то грибов, но тем не менее есть один зачетный вопрос, который у меня, по меньшей мере, вызывает недоумение... Итак, вопрос (в экзаменационной форме, без вопросительных знаков):

Возможность определения новых объектов на основе уже существующего объекта более высокого уровня путем передачи им значений некоторых свойств этого объекта. Понятие наследования. Пример наследования в среде проектирования и программирования Windows-приложений Visual Basic.


Прокоментируйте, господа...


Ну если только VB.NET они имели ввиду...

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 21.12.2007 (Пт) 13:52

Речь идет о VB 6. alibek, Каким образом можно сделать синтаксические конструкции самостоятельно?
ХЎ

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.12.2007 (Пт) 14:00

Я не говорил о синтаксической конструкции. Я говорил о том, что можно самому сделать наследование. Например создать класс Base, в котором будет некий набор свойств. И создать класс Child, в котором будет набор свойств из Base + некоторые свои.
Lasciate ogni speranza, voi ch'entrate.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 21.12.2007 (Пт) 14:05

alibek писал(а):Я не говорил о синтаксической конструкции.(...)


А по-моему как раз говорил:

alibek писал(а):(...)
Синтаксических конструкций нет. Но их можно сделать самостоятельно.
(...)


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

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Re: Наследование

Сообщение BION » 21.12.2007 (Пт) 14:36

Можт вот это еще как-то обыграть, хотя...
http://www.vbforums.com/showthread.php?t=396428&highlight=Implements

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.12.2007 (Пт) 14:55

А что там? Автор поста не видит разницу между понятиями "класс поддерживает интерфейс" и "класс унаследован от класса".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 21.12.2007 (Пт) 15:15

Хакер писал(а):А что там? Автор поста не видит разницу между понятиями "класс поддерживает интерфейс" и "класс унаследован от класса".


Хорошо, вот для закрепления материала:
http://bbs.vbstreets.ru/viewtopic.php?t=2656&highlight=implements

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 21.12.2007 (Пт) 15:31

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.12.2007 (Пт) 15:47

BION
Автор не этогопоста (т.е. я), а автор этогопоста.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 21.12.2007 (Пт) 16:01

Хакер писал(а):BION
Автор не этогопоста (т.е. я), а автор этогопоста.


Дружишче!:) Тут(где мы щас находмся) реч шла о наследовании, а здесь http://bbs.vbstreets.ru/viewtopic.php?t=2656&highlight=implements затрагивался тот же вопрос. Есть даже пример. Надеюсь автору вот этого поста (где мы щас находмся) указанная ссылка поможет разобраться в этом вопросе, надеюсь Вам тоже.
Всем спасибо, все свободны :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.12.2007 (Пт) 16:06

Там, куда была дана ссылка, вопрос наследования не рассматривался. Там автор топика показал своё незнание разницы между наследованием (inheritance) и поддержкой интерфейсов (implementing).

Там (даже) нет примера наследования. Там есть пример обращения к объекту класса через разные интерфейсы.

Автор этого топика, я почти уверен, и без того знает, что в VB6 наследования нет, и именно поэтому (и не безосновательно) предполагает, что преподы наелись грибов.

Поэтому, я сомневаюсь, что ссылка поможет ему в чём-либо разобраться. Я я тем более, что эта ссылка не поможет мне разобраться, потому что разбираюсь я в этом в достаточной степени хорошо.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 21.12.2007 (Пт) 16:14

Хакер писал(а):Там, куда была дана ссылка, вопрос наследования не рассматривался. Там автор топика показал своё незнание разницы между наследованием (inheritance) и поддержкой интерфейсов (implementing).

Там (даже) нет примера наследования. Там есть пример обращения к объекту класса через разные интерфейсы.

Автор этого топика, я почти уверен, и без того знает, что в VB6 наследия нет, и именно поэтому (и не безосновательно) предполагает, что преподы наелись грибов.

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



А никто не говорит, что в ВБ оно есть. И уж тем более не ставятся под сомнения Ваши знания в данном вопросе.
Там показана попытка сделать подобие наследования, и там же сделан вывод, что это все грабли.
Вот, шоб все видели:
skiperski писал(а):По просьбам трудящихся.

Наследование один из основных принципов объекто ориентированного программирования. Кроме того, к ним относят инкапсуляцию, что в VB реализовано в виде классов, и полиморфизм. Последнее является следствием наследования, а т.к. оно в VB реализовано безобразно, то можно считать, что его тоже нет.

Что даёт наследование? В нормальной реализации очень многое. Объект-детёныш наследует все св-ва, методы и события родительского объекта. Т.о. для расширения интерфейса класса, например TextBox, достаточно объявить его наследником уже существующего и дописать свои необходимые новые св-ва, методы и/или события.

Как это реализовано в VB? В VB не достаточно просто объявить класс-родитель. Необходимо ещё, кроме того, декларировать и переобъявить все его св-ва, методы и события. Т.е. если объект имеет 33 св-ва (n), то их все необходимо переобъявить. И если в интерфейсе объекта-детёныша они же должны присутствовать, то их нужно задекларировать. Т.о. вместо дописывания одной-двух (m) необходимых функций, вынуждены написать их 2*n+m (в данном примере 33*2+2=68 ) штук, что уже само по себе не доставляет удовольствия от использования такого механизма. А учитывая, что практически каждое св-во представлено парами Get/Let(Set), то кол-во работы удваивается. Но ещё хуже то, что приходится угадывать как работает то или иное св-во объекта-родителя, чтобы полностью имитировать те св-ва, которые изменять нежелательно.

Малюсенький пример:

Class1
Код: Выделить всё
Option Explicit

Private miIndex As Long

Public Property Get Index() As Long
    Index = miIndex
End Property

Public Property Let Index(ByVal newValue As Long)
    miIndex = Index
End Property


Class2
Код: Выделить всё
Option Explicit

Implements Class1

Private moClass1 As New Class1
Private msValue As String

'переопределяем св-ва объекта-родителя
Private Property Let Class1_Index(ByVal RHS As Long)
    moClass1.Index = RHS
End Property

Private Property Get Class1_Index() As Long
    Class1_Index = moClass1.Index
End Property

'декларируем идентичные св-ва в нашем объекте
Public Property Let Index(ByVal newValue As Long)
    moClass1.Index = newValue
End Property

Public Property Get Index() As Long
    Index = moClass1.Index
End Property

'и, наконец, дописываем собственное св-во
Public Property Let Value(ByVal newValue As String)
    msValue = newValue
End Property

Public Property Get Value() As String
    Value = msValue
End Property

И это только для объекта с одним св-ом с заранее известным поведением. Исходя из вышеизложенного, делаем выводы и пользуемся заветной комбинацией ^C ^V, что экономит время и нервы.


П.С. Надеюсь спор исчерпал себя.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 21.12.2007 (Пт) 16:44

благодарю всех откликнувшихся.

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

Свой интерес удовлетворил, благодарю еще раз )
ХЎ

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.12.2007 (Пт) 16:51

Тем не менее, есть такое мнение:

Преподы ждут класса, внутри которого объявлена локальная ссылка на объект класса-родителя.

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

Можно пойти дальше, и сделать переходники не кодом, а правкой адресов в VTable.

Можно пойти ещё дальше, перехватив IDispatch::GetIDsOfNames, IDispatch::Invoke и создавая свою собственную VTable.

Так в принципе можно реализовать более-менее прозрачное наследие.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 21

    TopList