Implements не компилится на VB6 :(
От: Ignoramus  
Дата: 24.06.05 08:53
Оценка:
Я новичок в VB, пришедший (вынужденно) из рядов С++.

Хочу сделать простое множество классов типа 1 абстрактный интерфейс + несколько классов имплементаций, чтобы потом типа полиморфизм сбацать

Пишу так:



'(module IInterface1.cls)

Option Explicit

Public Sub Method1()
End Sub

Public Sub Method2()
End Sub


'(module Implementation1.cls)

Option Explicit

Implements IInterface1

Public Sub Method1()
 ' do something
End Sub

Public Sub Method2()
 ' do something
End Sub


Получаю ошибку компиляции:

Object module needs to implement 'Method1' for interface 'IInterface1'.

В чем тут проблема?

Заранее благодарен.
Re: Implements не компилится на VB6 :(
От: Avos Беларусь  
Дата: 24.06.05 08:58
Оценка: 8 (1)
Здравствуйте, Ignoramus, Вы писали:

I>
I>'(module IInterface1.cls)

I>Option Explicit

I>Public Sub Method1()
I>End Sub

I>'(module Implementation1.cls)

I>Option Explicit

I>Implements IInterface1

I>Public Sub IInterface1_Method1()
I> ' do something
I>End Sub

I>


привет!
нужно писать, как выделено выше жирным шрифтом.
ага!
Re[2]: Implements не компилится на VB6 :(
От: Ignoramus  
Дата: 24.06.05 09:01
Оценка:
Здравствуйте, Avos, Вы писали:

A>привет!

A>нужно писать, как выделено выше жирным шрифтом.
A>ага!

Спасибо! Кто бы мог подумать, нигде в МСДН такого не замечал. Это несколько неочевидно имхо Боюсь, в VB я столкнусь еще со многими неочевидностями...
Re: А N раз наследовать можно?
От: Ignoramus  
Дата: 24.06.05 10:04
Оценка:
Возможна ли конструкция вроде такой:

'(module IInterface1.cls)

Option Explicit

Public Sub Method1()
End Sub

Public Sub Method2()
End Sub


'(module Implementation1.cls)

Option Explicit

Implements IInterface1

Public Sub IInterface1_Method1()
  ' do something
End Sub

Public Sub IInterface1_Method2()
 ' do something
End Sub


'(module Implementation2.cls)

Option Explicit

Implements Implementation1

Public Sub Implementation1_Method1()
  ' do something
End Sub

Public Sub Implementation1_Method2()
 ' do something
End Sub


Если да, то какой правильный синтаксис?

И можно ли оставлять некоторые методы неимплементированными в промежуточных классах (Implementation1) ?
Re[2]: Implements не компилится на VB6 :(
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.06.05 10:26
Оценка: 8 (1)
Здравствуйте, Avos, Вы писали:

I>>Implements IInterface1

I>>Public Sub IInterface1_Method1()
I>> ' do something
I>>End Sub


A>нужно писать, как выделено выше жирным шрифтом.


Не только. Нужно еще Доступ ограничить.
Implements IInterface1

Private Sub IInterface1_Method1()
 ' do something
End Sub
PS
А вообще лучше пользоваться выпадающими списками — после того как написал "Implements IInterface1" становится доступным пункт "IInterface1" в нем.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Implements не компилится на VB6 :(
От: Ignoramus  
Дата: 24.06.05 11:03
Оценка:
Здравствуйте, Vi2, Вы писали:


Vi2>Не только. Нужно еще Доступ ограничить.


Ух ты! VB — крутой язык!

Vi2>
Vi2>Implements IInterface1

Vi2>Private Sub IInterface1_Method1()
Vi2> ' do something
Vi2>End Sub
Vi2>
PS

Vi2>А вообще лучше пользоваться выпадающими списками — после того как написал "Implements IInterface1" становится доступным пункт "IInterface1" в нем.

Классно, спасибо.

Так как насчет повторного наследования? Если я пишу Implements Implementation1, в списке ничего не выпадает...
Re[4]: Implements не компилится на VB6 :(
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.06.05 12:06
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Так как насчет повторного наследования? Если я пишу Implements Implementation1, в списке ничего не выпадает...


Нет повторного наследования в плане наращивания количества методов. Implements не добавляет новых методов к интерфейсу класса, в котором он определен.

' (module Class1.cls)

Public Sub Method1()
End Sub

' (module Class2.cls)

Implements Class1 ' выпадет Method1 

Private Sub Class1_Method1()
End Sub

Public Sub Method2()
End Sub

' (module Class3.cls)

Implements Class1 ' выпадет Method1
Implements Class2 ' выпадет Method2

Private Sub Class1_Method1()
End Sub

Private Sub Class2_Method2()
End Sub

Public Sub Method3()
End Sub

Здесь каждый класс ClassN определяет свой интерфейс (он имеет скрытое имя _ClassN) с одним методом MethodN. И никакого наследования или связи между классами или интерфейсами.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Implements не компилится на VB6 :(
От: Ignoramus  
Дата: 24.06.05 12:18
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Нет повторного наследования в плане наращивания количества методов. Implements не добавляет новых методов к интерфейсу класса, в котором он определен.


Ну то, что добавлять методы нельзя, я уже понял.

Просто хотел внести в иерархию дополнительный узловой класс (между полной абстракцией и полной имплементацией), в котором бы:

1) были имплементированы только часть всех методов, а все остальные в оконечных имплементациях
2) наоборот, имплементированы все методы, а в оконечных тогда часть опущены а часть замещены
3) еще такой вопрос — можно ли в базовом классе делать методы не пустыми, а потом вызывать их из наследников?

Так можно?


Vi2>Implements Class1 ' выпадет Method1

Vi2>Implements Class2 ' выпадет Method2

Ух ты, даже множественное наследование есть
Re[6]: Implements не компилится на VB6 :(
От: Vi2 Удмуртия http://www.adem.ru
Дата: 27.06.05 04:15
Оценка: 8 (1)
Здравствуйте, Ignoramus, Вы писали:

I>Просто хотел внести в иерархию дополнительный узловой класс (между полной абстракцией и полной имплементацией), в котором бы:


I>1) были имплементированы только часть всех методов, а все остальные в оконечных имплементациях

I>2) наоборот, имплементированы все методы, а в оконечных тогда часть опущены а часть замещены
I>3) еще такой вопрос — можно ли в базовом классе делать методы не пустыми, а потом вызывать их из наследников?

I>Так можно?


Нет. VB — это не С++, а чистый СОМ. Implements говорит о том, что класс будет поддерживать такой интерфейс. (В терминах СОМ и С++ класс начнет откликаться на запрос QueryInterface с IID этого интерфейса. И больше ничего.) По требованию VB компилятора класс должен реализовать КАЖДЫЙ метод заявленного в Implements интерфейса.

Код интерфейса не наследуется, наследуется только описание интерфейса. Исключений нет. Это, повторяю, не С++.

Чтобы использовать уже написанный код в классе, нужно создавать экземпляр этого класса и вызвать его методы. Например так:

' (module Class1.cls)

Public Sub Method1()
End Sub

' (module Class2.cls)

Implements Class1 ' выпадет Method1 
Private myInnerObject As New Class1

Private Sub Class1_Method1()
  myInnerObject.Method1
End Sub

Public Sub Method2()
End Sub
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.