พิมพ์ข้อผิดพลาดที่ไม่ตรงกันเมื่อส่งประเภทลูกไปยังรูทีนย่อยที่ยอมรับประเภทแม่ VBA

บริบท

ฉันมีอินเทอร์เฟซหลัก IParent,

Option Explicit

Public Sub DoParentStuff()
End Sub

ส่วนต่อประสานลูกที่ใช้ IParent, IChild,

Option Explicit

Implements IParent

Private Sub IParent_DoParentStuff()
End Sub

Public Sub DoParentStuff()
End Sub

และการนำไปปฏิบัติอย่างเป็นรูปธรรมของ IChild, CStandardChild

Option Explicit

Implements IChild

Private Sub IChild_DoParentStuff()
End Sub

Public Sub DoParentStuff()
  IChild_DoParentStuff
End Sub

จากนั้น ฉันสร้างโมดูลที่ส่งตัวแปรประเภท IChild ไปยังรูทีนย่อยที่มีพารามิเตอร์ประเภท 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

ฉันสามารถคอมไพล์โครงการ VBA ได้โดยไม่มีข้อผิดพลาด แต่เมื่อฉันรัน Main ฉันได้รับข้อผิดพลาดรันไทม์

ข้อผิดพลาดรันไทม์ '13':

ประเภทไม่ตรงกัน

ดีบักเกอร์ชี้ไปที่โค้ด Test child

คำถาม

เหตุใดฉันจึงได้รับข้อผิดพลาดรันไทม์ ประเภทไม่ตรงกัน ฉันจะส่งผ่าน child ถึง Test() โดยไม่ได้รับข้อผิดพลาดนี้ได้อย่างไร

สิ่งที่ฉันได้ลอง

ฉันได้ดูการคัดเลือกนักแสดงจาก IChild ถึง IParent แล้ว อย่างไรก็ตาม ฉันไม่ได้ใช้ VB.NET ดังนั้นฉันจึงไม่สามารถเข้าถึง DirectCast และ CType ในการพูดแบบนี้ หากฉันใช้ IParent และ IChild อย่างเหมาะสม ฉันไม่คิดว่าจำเป็นต้องมีนักแสดง


person Joshua Daly    schedule 12.11.2018    source แหล่งที่มา
comment
ฉันไม่แน่ใจว่าฉันเข้าใจคำถาม คุณแค่กำลังมองหาวิธีส่งไปที่ IParent ใน VBA หรือไม่? เพียงแค่ประกาศ Dim foo As IParent: Set foo = child   -  person Comintern    schedule 13.11.2018
comment
สวัสดี @Comintern ฉันกำลังพยายามส่ง child ไปยัง Test() โดยไม่ได้รับข้อผิดพลาด Type mismatch อย่างไรก็ตาม ความคิดเห็นของคุณอาจเป็นแนวทางได้ ฉันจะลองดู ขอบคุณ   -  person Joshua Daly    schedule 13.11.2018


คำตอบ (1)


หากฉันเข้าใจถูกต้องว่าคุณกำลังพยายามทำอะไร ดูเหมือนว่าคุณกำลังพยายามขยาย IParent ด้วยสมาชิก IChild คน คุณไม่สามารถทำเช่นนั้นใน VBA ได้ คงจะดีมาก แต่มันเป็นส่วนหนึ่งของสิ่งที่ทำให้ .NET เป็นเฟรมเวิร์กที่ยืดหยุ่นมากขึ้นในการทำงานด้วย

หากต้องการเปรียบเทียบ C# - นี่คือสิ่งที่ฉันคิดว่าคุณกำลังพยายามทำ (และผิดกฎหมายใน VBA):

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

หากคุณต้องการให้ CStandardChild สามารถเข้าถึงได้ผ่านอินเทอร์เฟซทั้ง IParent และ IChild คุณต้องมีทั้งคำสั่ง Implements ในคลาสนั้น:

Option Explicit
Implements IChild
Implements IParent

'implement members of both interfaces...

จากนั้นคุณสามารถส่งอินสแตนซ์ของคลาสนั้นและ "ส่ง" ไปยังอินเทอร์เฟซใดก็ได้

person Mathieu Guindon    schedule 12.11.2018
comment
ขอบคุณ นี่เป็นเรื่องดีที่ได้รู้ - person Joshua Daly; 13.11.2018