Kesalahan Ketik Ketidakcocokan saat Meneruskan Tipe Anak ke Subrutin yang menerima VBA Tipe Induk

Konteks

Saya memiliki antarmuka induk, IParent,

Option Explicit

Public Sub DoParentStuff()
End Sub

antarmuka anak yang mengimplementasikan IParent, IChild,

Option Explicit

Implements IParent

Private Sub IParent_DoParentStuff()
End Sub

Public Sub DoParentStuff()
End Sub

dan implementasi konkrit IChild, CStandardChild.

Option Explicit

Implements IChild

Private Sub IChild_DoParentStuff()
End Sub

Public Sub DoParentStuff()
  IChild_DoParentStuff
End Sub

Saya kemudian membuat modul yang meneruskan variabel tipe IChild ke subrutin dengan satu parameter tipe IParent.

Option Explicit

Private Sub Test(ByRef parent As IParent)
  parent.DoParentStuff
End Sub

Public Sub Main()
  Dim child As IChild
  
  Set child = New CStandardChild
  
  Test child
End Sub

Saya dapat mengkompilasi proyek VBA tanpa kesalahan. Namun, saat saya menjalankan Main, saya mendapatkan error run-time

Kesalahan waktu proses '13':

Jenis ketidakcocokan

Debugger menunjuk ke kode Test child.

Pertanyaan

Mengapa saya mendapatkan error run-time, type-mismatch? Bagaimana saya bisa meneruskan child ke Test() tanpa mendapatkan kesalahan ini?

Apa yang Saya Coba

Saya telah mempertimbangkan untuk melakukan casting IChild ke IParent. Namun, saya tidak menggunakan VB.NET, jadi saya tidak memiliki akses ke DirectCast dan CType. Dengan mengatakan ini, jika saya telah menerapkan IParent dan IChild dengan tepat, menurut saya pemeran tidak diperlukan.


person Joshua Daly    schedule 12.11.2018    source sumber
comment
Saya tidak yakin saya memahami pertanyaannya. Apakah Anda hanya mencari cara untuk melakukan cast ke IParent di VBA? Cukup nyatakan Dim foo As IParent: Set foo = child   -  person Comintern    schedule 13.11.2018
comment
Hai @Comintern, saya mencoba meneruskan child ke Test() tanpa menerima kesalahan Type mismatch. Namun, komentar Anda mungkin bisa menjadi cara untuk melakukannya, saya akan mencobanya, terima kasih.   -  person Joshua Daly    schedule 13.11.2018


Jawaban (1)


Jika saya memahami dengan benar apa yang Anda coba lakukan, sepertinya Anda mencoba memperluas IParent dengan IChild anggota. Anda tidak bisa melakukan itu di VBA - ini akan luar biasa, tapi itu bagian dari apa yang menjadikan .NET kerangka kerja yang lebih fleksibel untuk digunakan.

Untuk mengambil analogi C# - inilah yang menurut saya Anda coba lakukan (dan ilegal di VBA):

interface IFoo { void DoSomething() }
interface IBar : IFoo { void DoStuff() } // inherits members of IFoo

Jika Anda memerlukan CStandardChild agar dapat diakses melalui antarmuka IParent dan IChild, Anda memerlukan kedua pernyataan Implements di kelas tersebut:

Option Explicit
Implements IChild
Implements IParent

'implement members of both interfaces...

Kemudian Anda dapat meneruskan sebuah instance dari kelas itu dan "mentransmisikannya" ke salah satu antarmuka.

person Mathieu Guindon    schedule 12.11.2018
comment
Terima kasih, senang mengetahuinya. - person Joshua Daly; 13.11.2018