Same behavior by replacing a nested TYPE (temporary) by an equivalent permanent variable when possible.
Example for a three-level inheritance structure (UDT1 <- UDT2 <- UDT3 <- UDT4):
Code: Select all
Type UDT1
Dim As Integer I11, I12
End Type
Type UDT2 Extends UDT1
Dim As Integer I21, I22, I23, I24
End Type
Type UDT3 Extends UDT2
Dim As Integer I31, I32, I33
End Type
Type UDT4 Extends UDT3
Dim As Integer I41
End Type
Dim As UDT1 u1
Print "No Inheritance (UDT1)"
u1 = Type<UDT1>(1, 2)
Print " u1 = Type<UDT1>(1, 2) => OK"
Print " UDT1: "; u1.I11; u1.I12
Print
Dim As UDT2 u20, u2
Print "Single Inheritance (UDT1 <- UDT2):"
u2 = u20
u2 = Type<UDT2>(1, 2, 3, 4, 5, 6)
print " Type<UDT2>(1, 2, 3, 4, 5, 6) => OK"
Print " UDT1: "; u2.I11; u2.I12
Print " UDT2: "; u2.I21; u2.I22; u2.I23; u2.I24
u2 = u20
u2 = Type<UDT2>(Type<UDT1>(1, 2), 3, 4, 5, 6)
Print " Type<UDT2>(Type<UDT1>(1, 2), 3, 4, 5, 6) => OK"
Print " UDT1: "; u2.I11; u2.I12
Print " UDT2: "; u2.I21; u2.I22; u2.I23; u2.I24
u2 = u20
u2 = Type<UDT2>(u1, 3, 4, 5, 6)
Print " Type<UDT2>(u1, 3, 4, 5, 6) => OK"
Print " UDT1: "; u2.I11; u2.I12
Print " UDT2: "; u2.I21; u2.I22; u2.I23; u2.I24
u2 = Type<UDT2>(1, 2, 3, 4, 5, 6)
Print
Dim As UDT3 u30, u3
Print "Two-Level Inheritance (UDT1 <- UDT2 <- UDT3):"
u3 = u30
u3 = Type<UDT3>(1, 2, 3, 4, 5, 6, 7, 8, 9)
Print " Type<UDT3>(1, 2, 3, 4, 5, 6, 7, 8, 9) => OK"
Print " UDT1: "; u3.I11; u3.I12
Print " UDT2: "; u3.I21; u3.I22; u3.I23; u3.I24
Print " UDT3: "; u3.I31; u3.I32; u3.I33
u3 = u30
u3 = Type<UDT3>(Type<UDT2>(1, 2, 3, 4, 5, 6), 7, 8, 9)
Print " Type<UDT3>(Type<UDT2>(1, 2, 3, 4, 5, 6), 7, 8, 9) => NOK"
Print " UDT1: "; u3.I11; u3.I12
Print " UDT2: "; u3.I21; u3.I22; u3.I23; u3.I24
Print " UDT3: "; u3.I31; u3.I32; u3.I33
u3 = u30
u3 = Type<UDT3>(Type<UDT2>(Type<UDT1>(1, 2), 3, 4, 5, 6), 7, 8, 9)
Print " Type<UDT3>(Type<UDT2>(Type<UDT1>(1, 2), 3, 4, 5, 6), 7, 8, 9) => NOK"
Print " UDT1: "; u3.I11; u3.I12
Print " UDT2: "; u3.I21; u3.I22; u3.I23; u3.I24
Print " UDT3: "; u3.I31; u3.I32; u3.I33
u3 = u30
u3 = Type<UDT3>(u2, 7, 8, 9)
Print " Type<UDT3>(u2, 7, 8, 9) => NOK"
Print " UDT1: "; u3.I11; u3.I12
Print " UDT2: "; u3.I21; u3.I22; u3.I23; u3.I24
Print " UDT3: "; u3.I31; u3.I32; u3.I33
u3 = u30
u3 = Type<UDT3>(Type<UDT2>(u1, 3, 4, 5, 6), 7, 8, 9)
Print " Type<UDT3>(Type<UDT2>(u1, 3, 4, 5, 6), 7, 8, 9) => NOK"
Print " UDT1: "; u3.I11; u3.I12
Print " UDT2: "; u3.I21; u3.I22; u3.I23; u3.I24
Print " UDT3: "; u3.I31; u3.I32; u3.I33
u3 = Type<UDT3>(1, 2, 3, 4, 5, 6, 7, 8, 9)
Print
Dim As UDT4 u40, u4
Print "Three-Level Inheritance (UDT1 <- UDT2 <- UDT3 <- UDT4):"
u4 = u40
u4 = Type<UDT4>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Print " Type<UDT4>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) => OK"
Print " UDT1: "; u4.I11; u4.I12
Print " UDT2: "; u4.I21; u4.I22; u4.I23; u4.I24
Print " UDT3: "; u4.I31; u4.I32; u4.I33
Print " UDT4: "; u4.I41
u4 = u40
u4 = Type<UDT4>(Type<UDT3>(1, 2, 3, 4, 5, 6, 7, 8, 9), 10)
Print " Type<UDT4>(Type<UDT3>(1, 2, 3, 4, 5, 6, 7, 8, 9), 10) => NOK"
Print " UDT1: "; u4.I11; u4.I12
Print " UDT2: "; u4.I21; u4.I22; u4.I23; u4.I24
Print " UDT3: "; u4.I31; u4.I32; u4.I33
Print " UDT4: "; u4.I41
u4 = u40
u4 = Type<UDT4>(Type<UDT3>(Type<UDT2>(1, 2, 3, 4, 5, 6), 7, 8, 9), 10)
Print " Type<UDT4>(Type<UDT3>(Type<UDT2>(1, 2, 3, 4, 5, 6), 7, 8, 9), 10) => NOK"
Print " UDT1: "; u4.I11; u4.I12
Print " UDT2: "; u4.I21; u4.I22; u4.I23; u4.I24
Print " UDT3: "; u4.I31; u4.I32; u4.I33
Print " UDT4: "; u4.I41
u4 = u40
u4 = Type<UDT4>(Type<UDT3>(Type<UDT2>(Type<UDT1>(1, 2), 3, 4, 5, 6), 7, 8, 9), 10)
Print " Type<UDT4>(Type<UDT3>(Type<UDT2>(Type<UDT1>(1, 2), 3, 4, 5, 6), 7, 8, 9), 10) => NOK"
Print " UDT1: "; u4.I11; u4.I12
Print " UDT2: "; u4.I21; u4.I22; u4.I23; u4.I24
Print " UDT3: "; u4.I31; u4.I32; u4.I33
Print " UDT4: "; u4.I41
u4 = u40
u4 = Type<UDT4>(u3, 10)
Print " Type<UDT4>(u3, 10) => NOK"
Print " UDT1: "; u4.I11; u4.I12
Print " UDT2: "; u4.I21; u4.I22; u4.I23; u4.I24
Print " UDT3: "; u4.I31; u4.I32; u4.I33
Print " UDT4: "; u4.I41
u4 = u40
u4 = Type<UDT4>(Type<UDT3>(u2, 7, 8, 9), 10)
Print " Type<UDT4>(Type<UDT3>(u2, 7, 8, 9), 10) => NOK"
Print " UDT1: "; u4.I11; u4.I12
Print " UDT2: "; u4.I21; u4.I22; u4.I23; u4.I24
Print " UDT3: "; u4.I31; u4.I32; u4.I33
Print " UDT4: "; u4.I41
u4 = u40
u4 = Type<UDT4>(Type<UDT3>(Type<UDT2>(u1, 3, 4, 5, 6), 7, 8, 9), 10)
Print " Type<UDT4>(Type<UDT3>(Type<UDT2>(u1, 3, 4, 5, 6), 7, 8, 9), 10) => NOK"
Print " UDT1: "; u4.I11; u4.I12
Print " UDT2: "; u4.I21; u4.I22; u4.I23; u4.I24
Print " UDT3: "; u4.I31; u4.I32; u4.I33
Print " UDT4: "; u4.I41
Sleep
- Output:
Code: Select all
No Inheritance (UDT1) u1 = Type<UDT1>(1, 2) => OK UDT1: 1 2 Single Inheritance (UDT1 <- UDT2): Type<UDT2>(1, 2, 3, 4, 5, 6) => OK UDT1: 1 2 UDT2: 3 4 5 6 Type<UDT2>(Type<UDT1>(1, 2), 3, 4, 5, 6) => OK UDT1: 1 2 UDT2: 3 4 5 6 Type<UDT2>(u1, 3, 4, 5, 6) => OK UDT1: 1 2 UDT2: 3 4 5 6 Two-Level Inheritance (UDT1 <- UDT2 <- UDT3): Type<UDT3>(1, 2, 3, 4, 5, 6, 7, 8, 9) => OK UDT1: 1 2 UDT2: 3 4 5 6 UDT3: 7 8 9 Type<UDT3>(Type<UDT2>(1, 2, 3, 4, 5, 6), 7, 8, 9) => NOK UDT1: 1 2 UDT2: 7 8 9 0 UDT3: 0 0 0 Type<UDT3>(Type<UDT2>(Type<UDT1>(1, 2), 3, 4, 5, 6), 7, 8, 9) => NOK UDT1: 1 2 UDT2: 7 8 9 0 UDT3: 0 0 0 Type<UDT3>(u2, 7, 8, 9) => NOK UDT1: 1 2 UDT2: 7 8 9 0 UDT3: 0 0 0 Type<UDT3>(Type<UDT2>(u1, 3, 4, 5, 6), 7, 8, 9) => NOK UDT1: 1 2 UDT2: 7 8 9 0 UDT3: 0 0 0 Three-Level Inheritance (UDT1 <- UDT2 <- UDT3 <- UDT4): Type<UDT4>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) => OK UDT1: 1 2 UDT2: 3 4 5 6 UDT3: 7 8 9 UDT4: 10 Type<UDT4>(Type<UDT3>(1, 2, 3, 4, 5, 6, 7, 8, 9), 10) => NOK UDT1: 1 2 UDT2: 10 0 0 0 UDT3: 0 0 0 UDT4: 0 Type<UDT4>(Type<UDT3>(Type<UDT2>(1, 2, 3, 4, 5, 6), 7, 8, 9), 10) => NOK UDT1: 1 2 UDT2: 10 0 0 0 UDT3: 0 0 0 UDT4: 0 Type<UDT4>(Type<UDT3>(Type<UDT2>(Type<UDT1>(1, 2), 3, 4, 5, 6), 7, 8, 9), 10) => NOK UDT1: 1 2 UDT2: 10 0 0 0 UDT3: 0 0 0 UDT4: 0 Type<UDT4>(u3, 10) => NOK UDT1: 1 2 UDT2: 10 0 0 0 UDT3: 0 0 0 UDT4: 0 Type<UDT4>(Type<UDT3>(u2, 7, 8, 9), 10) => NOK UDT1: 1 2 UDT2: 10 0 0 0 UDT3: 0 0 0 UDT4: 0 Type<UDT4>(Type<UDT3>(Type<UDT2>(u1, 3, 4, 5, 6), 7, 8, 9), 10) => NOK UDT1: 1 2 UDT2: 10 0 0 0 UDT3: 0 0 0 UDT4: 0
In the failing cases, only the data members of the topmost Base (UDT1 in the example above) are correctly initialized.