Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с наследованием / 9 сообщений из 9, страница 1 из 1
23.01.2019, 15:08
    #39763555
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с наследованием
Что-то я туплю. После шарпов забыл вб. :(
Есть базовый класс:

BaseClass.cls
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Option Explicit
Private mvarTxt As String

Public Property Let Txt(ByVal vData As String)
 mvarTxt = vData
End Property

Public Property Get Txt() As String
 Txt = mvarTxt
End Property



И два наследника:

AnsiText.cls

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Option Explicit

Implements BaseClass

Private mvarTxt As String
Private mvarAnsiText As Variant
Private mBase As BaseClass

Public Property Let AnsiText(ByVal vData As String)
    mvarAnsiText = vData
End Property

Public Property Get AnsiText() As String
    AnsiText = mvarAnsiText
End Property

Public Property Let BaseClass_Txt(ByVal vData As String)
    mBase.Txt = vData
End Property

Public Property Get BaseClass_Txt() As String
    BaseClass_Txt = mBase.Txt
End Property
Private Sub Class_Initialize()
    Set mBase = New BaseClass
End Sub



UnicodeText.cls

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Option Explicit

Implements BaseClass

Private mvarTxt As String
Private mvarUnicodeText As Variant
Private mBase As BaseClass

Public Property Let UnicodeText(ByVal vData As String)
    mvarUnicodeText = vData
End Property
Public Property Get UnicodeText() As String
    UnicodeText = mvarUnicodeText
End Property

Public Property Let BaseClass_Txt(ByVal vData As String)
    mBase.Txt = vData
End Property

Public Property Get BaseClass_Txt() As String
    BaseClass_Txt = mBase.Txt
End Property

Private Sub Class_Initialize()
    Set mBase = New BaseClass
End Sub



Я хочу задать им свойства в зависимости от типа класса:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub Form_Load()
    Dim col As  New Collection
        col.Add New AnsiText
        col.Add New UnicodeText

    Dim obj As BaseClass
    For Each obj In col
       Select Case TypeName(obj)
     
        Case "AnsiText"
           obj.AnsiText = "ANSI"
        
         Case "UnicodeText"
            obj.UnicodeText = "UNICODE"
      End Select
           obj.Txt = "Text"
    Next

End Sub



Но оно вообще не компилируется. Ругается на строке obj.AnsiText = "ANSI" --> Method or data member not found!
Как тут сделать правильно?
...
Рейтинг: 0 / 0
23.01.2019, 15:13
    #39763562
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с наследованием
Код: vbnet
1.
Dim obj As BaseClass
...
Рейтинг: 0 / 0
23.01.2019, 15:16
    #39763569
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с наследованием
... as Object
...
Рейтинг: 0 / 0
23.01.2019, 15:17
    #39763570
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с наследованием
А какой тип должен быть у obj ? Если Object то не очень удобно, нет выпадающих списков в редакторе
...
Рейтинг: 0 / 0
23.01.2019, 15:17
    #39763571
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с наследованием
сам же значешь , что только через tlb и интерфейс
...
Рейтинг: 0 / 0
23.01.2019, 15:17
    #39763572
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с наследованием
*знаешь
...
Рейтинг: 0 / 0
23.01.2019, 16:21
    #39763645
ЦЦа
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с наследованием
Eolt,

странная реализация наследования реализации :) Как технический момент - зачем члены, которые должны быть реализованы в рамках implements, означены как public?

Для удобства же использования ещё обычно делают тривиальные функции, кастующие к нужному типу:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Option Explicit

Public Function AsBaseClass(ByVal Obj As Object) As BaseClass
 Set AsBaseClass = Obj
End Function

Public Function AsAnsiText(ByVal Obj As Object) As AnsiText
 Set AsAnsiText = Obj
End Function

Public Function AsUnicodeText(ByVal Obj As Object) As UnicodeText
 Set AsUnicodeText = Obj
End Function



То есть в месте использования будет:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    Dim col As New Collection
    col.Add New AnsiText
    col.Add New UnicodeText

    Dim Obj As BaseClass
    For Each Obj In col
       Select Case TypeName(Obj)
     
        Case "AnsiText"
           AsAnsiText(Obj).AnsiText = "ANSI"
        
         Case "UnicodeText"
            AsUnicodeText(Obj).UnicodeText = "UNICODE"
       End Select
       Obj.Txt = "Text"
    Next

Ну и, вместо TypeName использовать TypeOf ... Is.
...
Рейтинг: 0 / 0
25.01.2019, 11:13
    #39764813
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с наследованием
Интерфейс IBaseClass:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Option Explicit

Public Property Let Txt(ByVal vData As String)
End Property

Public Property Get Txt() As String
End Property


CAnsiText:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Option Explicit

Implements IBaseClass

Private msTxt As String

Private Property Get IBaseClass_Txt() As String
    IBaseClass_Txt = msTxt
End Property

Private Property Let IBaseClass_Txt(ByVal RHS As String)
    msTxt = RHS
End Property


CUnicodeText:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Option Explicit

Implements IBaseClass

Private msTxt As String

Private Property Get IBaseClass_Txt() As String
    IBaseClass_Txt = msTxt
End Property

Private Property Let IBaseClass_Txt(ByVal RHS As String)
    msTxt = RHS
End Property


Использование:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Private Sub Form_Load()
    Dim cCol    As Collection
    Dim cObj    As IBaseClass
    
    Set cCol = New Collection
    
    cCol.Add New CAnsiText
    cCol.Add New CUnicodeText
    cCol.Add New CUnicodeText
    cCol.Add New CAnsiText
    
    For Each cObj In cCol
        
        If TypeOf cObj Is CUnicodeText Then
            cObj.Txt = "Unicode"
        ElseIf TypeOf cObj Is CAnsiText Then
            cObj.Txt = "Ansi"
        End If
        
    Next
    
End Sub
...
Рейтинг: 0 / 0
25.01.2019, 13:04
    #39764907
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с наследованием
ATM-TURBO 2,

ага спасибо, я так уже и сделал )
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с наследованием / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]