Bonjour à tous,

Je viens quémander un peu d'aide pour débarbouiller un bout de code que j'ai écrit car je n'arrive pas à produire ce que je veux de manière propre.
Mes problèmes se posent au niveau de l'héritage et de la surcharge de propriété.

Dans la classe de base, j'ai une propriété d'un type de base. Dans la classe dérivée, j'ai une propriété d'un type dérivé aussi. Mais du coup, si j'instancie la classe dérivée, je me retrouve avec la propriété en double...

Sans plus d'introduction, voici le code en question :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
Public MustInherit Class PromoDetail
    Public Property DTO As PROMO_DTO.PromoDetail
 
    Public Sub New(d As PROMO_DTO.PromoDetail)
        Me.DTO = d
    End Sub
 
    Public Function GetProducts() As List(Of PROMO_DTO.Product)
        If Me.DTO.Products.Count > 0 Then
            Return Me.DTO.Products
        ElseIf Me.DTO.ProductsOut.Count > 0 Then
            Return Me.DTO.ProductsOut
        Else
            Return Nothing
        End If
    End Function
 
    'Public MustOverride Sub FlagAsEncoded()
 
End Class
 
Public Class PromoDetailDemo
    Inherits PromoDetail
 
    Public Overloads Property DTO As PROMO_DTO.PromoDetailDemo
 
    Public Sub New(dto As PROMO_DTO.PromoDetailDemo)
        MyBase.New(dto)
        Me.DTO = dto
    End Sub
 
    Public Sub Delete()
        PROMO_DAL.PromoDetail.Delete(Me.DTO.Id)
    End Sub
End Class
 
Public Class PromoDetailsDemo
 
    Public Overloads Property DTO As List(Of PROMO_DTO.PromoDetailDemo)
 
    Public Sub New()
        Me.DTO = New List(Of PROMO_DTO.PromoDetailDemo)
    End Sub
 
    Public Sub New(dto As List(Of PROMO_DTO.PromoDetailDemo))
        Me.DTO = dto
    End Sub
 
    Public Sub Save(prm_id As Integer, ba_id As Byte)
        If CheckPercentageIsUniqueForList() Then
            PROMO_DAL.PromoDetail.SaveDemo(prm_id, ba_id, Me.DTO)
        Else
            Throw New EncodingDemoException("duplicate percentage", DTO(0).CodeDemo)
        End If
    End Sub
 
    Friend Function CheckPercentageIsUniqueForList() As Boolean
        Dim result As Boolean = True
        Dim percentList = (From dto In Me.DTO
                           Where dto.PercentType.Description = "LIST"
                           Select dto.Percentage)
 
        For Each p As Decimal In percentList.ToList
            If (From dto In Me.DTO
                Where dto.Percentage = p AndAlso dto.PercentType.Description = "LIST"
                Select dto).ToList.Count > 1 Then
                result = False
            End If
        Next
        Return result
    End Function
 
    Public Sub GetProducts()
        For Each d As PROMO_DTO.PromoDetailDemo In Me.DTO
            d.Products = PROMO_DAL.Product.GetDemoProduct(d.Id)
            d.ProductsOut = PROMO_DAL.Product.GetDemoProductOut(d.Id)
        Next
    End Sub
End Class
 
Public Class PromoDetailOwn
    Inherits PromoDetail
 
    Public Overloads Property DTO As PROMO_DTO.PromoDetailOwn
 
    Public Sub New(dto As PROMO_DTO.PromoDetailOwn)
        MyBase.New(dto)
        Me.DTO = dto
    End Sub
End Class
 
Public Class PromoDetailsOwn
    Public Property DTO As List(Of PROMO_DTO.PromoDetailOwn)
 
    Public Sub New()
        DTO = New List(Of PROMO_DTO.PromoDetailOwn)
    End Sub
 
    Public Sub New(dto As List(Of PROMO_DTO.PromoDetailOwn))
        Me.DTO = dto
    End Sub
 
    Public Sub Save(prm_id As Integer, ba_id As Byte)
        PROMO_DAL.PromoDetail.SaveOwn(prm_id, ba_id, Me.DTO)
    End Sub
 
    Public Sub GetProducts()
        For Each d As PROMO_DTO.PromoDetailOwn In Me.DTO
            d.Products = PROMO_DAL.Product.GetOwnProduct(d.Id)
            d.ProductsOut = PROMO_DAL.Product.GetOwnProductOut(d.Id)
        Next
    End Sub
End Class
 
Public Class PromoDetailDepartment
    Inherits PromoDetail
 
    Public Overloads Property DTO As PROMO_DTO.PromoDetailDepartment
 
    Public Sub New(dto As PROMO_DTO.PromoDetailDepartment)
        MyBase.New(dto)
        Me.DTO = dto
    End Sub
End Class
 
Public Class PromoDetailsDepartment
    Public Property DTO As List(Of PROMO_DTO.PromoDetailDepartment)
 
    Public Sub New()
        Me.DTO = New List(Of PROMO_DTO.PromoDetailDepartment)
    End Sub
 
    Public Sub New(dto As List(Of PROMO_DTO.PromoDetailDepartment))
        Me.DTO = dto
    End Sub
 
    Public Sub save(prm_id As Integer, ba_id As Byte)
        PROMO_DAL.PromoDetail.SaveDepartment(prm_id, ba_id, Me.DTO)
    End Sub
 
    Public Sub GetProducts() 'there is no inclusive list for department
        For Each d As PROMO_DTO.PromoDetailDepartment In Me.DTO
            d.ProductsOut = PROMO_DAL.Product.GetDeptProductOut(d.Id)
        Next
    End Sub
End Class
Il y a probablement plein de trucs à corriger là-dedans et, n'ayant jamais eu de vrai cours de POO ni aucun "expert" dans mon antourage avec qui échanger sur le sulet, je suis bien conscient, qu'en terme de POO, je fais de la merde. Donc lachez-vous, pour ce coup-ci, tout est permis .