Я новичок в 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 somethingEnd Sub
Public Sub Method2()
' do somethingEnd Sub
Получаю ошибку компиляции:
Object module needs to implement 'Method1' for interface 'IInterface1'.
'(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 somethingEnd Sub
Public Sub IInterface1_Method2()
' do somethingEnd Sub'(module Implementation2.cls)Option Explicit
Implements Implementation1
Public Sub Implementation1_Method1()
' do somethingEnd Sub
Public Sub Implementation1_Method2()
' do somethingEnd Sub
Если да, то какой правильный синтаксис?
И можно ли оставлять некоторые методы неимплементированными в промежуточных классах (Implementation1) ?
Vi2>Implements IInterface1
Vi2>PrivateSub IInterface1_Method1()
Vi2> ' do something
Vi2>End Sub
Vi2>
PS Vi2>А вообще лучше пользоваться выпадающими списками — после того как написал "Implements IInterface1" становится доступным пункт "IInterface1" в нем.
Классно, спасибо.
Так как насчет повторного наследования? Если я пишу Implements Implementation1, в списке ничего не выпадает...
Здравствуйте, 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 ' выпадет Method1Implements Class2 ' выпадет Method2Private Sub Class1_Method1()
End Sub
Private Sub Class2_Method2()
End Sub
Public Sub Method3()
End Sub
Здесь каждый класс ClassN определяет свой интерфейс (он имеет скрытое имя _ClassN) с одним методом MethodN. И никакого наследования или связи между классами или интерфейсами.
Здравствуйте, Vi2, Вы писали:
Vi2>Нет повторного наследования в плане наращивания количества методов. Implements не добавляет новых методов к интерфейсу класса, в котором он определен.
Ну то, что добавлять методы нельзя, я уже понял.
Просто хотел внести в иерархию дополнительный узловой класс (между полной абстракцией и полной имплементацией), в котором бы:
1) были имплементированы только часть всех методов, а все остальные в оконечных имплементациях
2) наоборот, имплементированы все методы, а в оконечных тогда часть опущены а часть замещены
3) еще такой вопрос — можно ли в базовом классе делать методы не пустыми, а потом вызывать их из наследников?
Здравствуйте, 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 Class1Private Sub Class1_Method1()
myInnerObject.Method1End Sub
Public Sub Method2()
End Sub