Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Visual Basic Новый топик    Ответить
 Проблема с наследованием  [new]
Eolt
Member

Откуда:
Сообщений: 1481
Что-то я туплю. После шарпов забыл вб. :(
Есть базовый класс:

BaseClass.cls
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

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

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


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

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!
Как тут сделать правильно?
23 янв 19, 15:08    [21792278]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с наследованием  [new]
Konst_One
Member

Откуда:
Сообщений: 11288
Dim obj As BaseClass
23 янв 19, 15:13    [21792286]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с наследованием  [new]
Konst_One
Member

Откуда:
Сообщений: 11288
... as Object
23 янв 19, 15:16    [21792295]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с наследованием  [new]
Eolt
Member

Откуда:
Сообщений: 1481
А какой тип должен быть у obj ? Если Object то не очень удобно, нет выпадающих списков в редакторе
23 янв 19, 15:17    [21792296]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с наследованием  [new]
Konst_One
Member

Откуда:
Сообщений: 11288
сам же значешь , что только через tlb и интерфейс
23 янв 19, 15:17    [21792298]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с наследованием  [new]
Konst_One
Member

Откуда:
Сообщений: 11288
*знаешь
23 янв 19, 15:17    [21792299]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с наследованием  [new]
ЦЦа
Member

Откуда:
Сообщений: 17
Eolt,

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

Для удобства же использования ещё обычно делают тривиальные функции, кастующие к нужному типу:
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


То есть в месте использования будет:
    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.
23 янв 19, 16:21    [21792398]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с наследованием  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
Интерфейс IBaseClass:
Option Explicit

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

Public Property Get Txt() As String
End Property

CAnsiText:
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:
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

Использование:
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
25 янв 19, 11:13    [21794053]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с наследованием  [new]
Eolt
Member

Откуда:
Сообщений: 1481
ATM-TURBO 2,

ага спасибо, я так уже и сделал )
25 янв 19, 13:04    [21794199]     Ответить | Цитировать Сообщить модератору
Все форумы / Visual Basic Ответить