Problème héritage entre classe

Résolu
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - Modifié le 21 avril 2017 à 18:02
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 22 avril 2017 à 18:56
Bonjour
Posons les bases du problème
Une classe mère

Public Class ClassPartitionLogique 
Public Property TotalSectors as Long ' nombre total de secteurs
' etc ......
End Class


une classe fille qui hérite de la classe mère
Public Class ClassPartitionNTFS
Inherits ClassPartitionLogique
Public Property ClusterMFt as integer ' premier cluster de la MFT
' etc ......
End Class


Dans le projet il y a une list(of ClassPartitionLogique) définie dans la classe ClassPartitionLogique
Lorsque j'explore les partitions de mon PC celles-ci s'ajoutent à cette List(of) et s'affichent dans une listview
Si je sélectionne une partition dans la listview j'ouvre une nouvelle Form dépendante du système de fichiers
si j'ouvre une partition NTFS par exemple dans la nouvelle Form je sais quelle est la partition logique
PartitionLogique = ClassPartitionLogique.PartitionLogiques(ClassData.Selection)


ClassPartitionLogique.PartitionLogiques est le list(of )
ClassData.Selection est l'index de la partition logique sélectionnée

Maintenant le problème
Dans cette nouvelle Form je mets en variable privée
Private PartitionNTFS as new ClassPartitionNTFS


Comment dans le code dire que
PartitionNTFS = PartitionLogique
?
en plus simple que l'objet PartitionNTFS en cours prenne les propriétés de l'objet Partitionlogique

Une conversion avec CType ( proposée par Visual Studio) génère une erreur : ce qui est logique
PartitionNTFS = CType(PartitionLogique, ClassPartitionNTFS)


Merci pour vos réponses


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 

1 réponse

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
21 avril 2017 à 18:34
Bonsoir

quand tu explores les partitions, tu ajoutes une partitionNtfs ou une partition?
1
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 21 avril 2017 à 19:10
bonsoir Whis

C'est comme les Cafetières de ton tuto ( la classe mère) et les 2 classes filles ( les cafetières avec filtre et celles avec dosette)

Lorsque j'explore les partitions j'ajoute un objet ClassPartionLogique
Je ne sais pas si la partition est NTFS ( donc classe fille ClassPartitionNTFS) ou FAT( donc classe fille ClassPartitionFAT)
Je n'ai pas fait la distinction entre les partitions FAT 16, FAT 32 et exFAT
Une fois la partition explorée je le sais mais je ne peux pas faire une List(of) avec 2 paramètres pour le of

Lorsque je sélectionne une partition dans la listview je sais quel est l'objet ClassPartitionlogique et si il est NTFS ou FAT ( donc quelle sera la classe fille à prendre en compte)
La classe PartitionNTFS dérivant de ClassPartitionlogique ( tout comme la ClassPartitionFAT) je ne sais pas comment renseigner un objet ClassPartitionNTFS qui aurait les propriétés de la Partition logique sélectionnée

Quelque chose comme PartionNTfs = un objet ClassPartitionNTFS avec toutes les propriétés de l'objet ClassPartitionlogique sélectionné
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
21 avril 2017 à 19:30
Comme quoi ça mérite plus d'éclaircissements.

Si dans la liste de Partition, tu ajoutes des NTFS et des FAT
PartitionNTFS = CType(PartitionLogique, NTFS)
, parce que même si PartitionLogique est stockée comme une Partition, elle a été instanciée comme NTFS.

Dans l'autre sens, à savoir, je crée des Partitions et au cas par cas j'en ferai des NTFS ou des FAT, ça ne marche pas.
La raison est que chaque Partition a instanciée comme une Partition. En poussant un peu plus loin, il faut voir que le fait d'instancier un objet va bloquer dans la mémoire un (des) espaces pour lui.
Par exemple, une personne a un nom, une date de naissance et des numéros de téléphones, l'instanciation va bloquer un peu de place pour toute la chaine d'héritage ascendante, une place pour une string, une place pour une date et une place pour une liste d'entier. Cette liste d'entier est elle-même un objet qui est prête à pointer vers des emplacements d'entiers.
Au fur et à mesure que tu ajoutes des numéros, tu instancies d’abord un entiers, qui va se placer quelque part dans la mémoire et on signale à la liste que cet emplacement va se remplir est lié à elle.
C'est comme ça qu'un objet peut être dans plusieurs collections.
Donc quand tu instancies une Partition, y a pas l’emplacement pour ClusterMFt.

L'idéal serait donc d'instancier dès le départ la bonne classe.

Si ça n'est vraiment pas possible, alors il faut que tu instancies une NTFS qui "copie" une Partition.
Par exemple avec un constructeur qui prend une Partition en paramètres.
Y'a 2 bémols:
  • tu te retrouve avec 2 instances qui représentent la même partitions.
  • dans ta liste d'origine tu ne peux pas profiter du polymorphisme.

Ça peut se solutionner en supprimant la Partition de la liste et en y ajoutant la NTFS

Attention lors de la copie des champs, ça ne se comporte pas forcément comme on le pense quand on à des types références et des types valeurs.
Pour les types références, la copie fait pointer vers la référence initiale, et donc toute modification dans Partition sera sera effective dans NTFS et vice et versa.
Pour les types valeurs, la copie crée une nouvelle valeur et chaque instance a les siennes autonomes.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
21 avril 2017 à 20:38
bonsoir Whismeril
Merci pour ces éclaircissements
Là ce soir je n'ai plus le temps car j'ai du monde à la maison
Je te dirais ce qu'il en est plus tard !
bonne soirée
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
Modifié le 22 avril 2017 à 17:46
Bonjour Whismeril
J'ai fait comme tu proposais

Dans une Classe Data générale j'ai défini ces 3 propriétés
Public Shared PartitionNTFS As ClassPartitionNTFS
Public Shared PartitionFAT As ClassPartitionFAT
Public Shared PartitionLogique As ClassPartitionLogique

' dans le code d'initialisation de la Form
ClassData.PartitionLogique = ClassPartitionLogique.PartitionLogiques(ClassData.Selection)
ClassData.PartitionFAT = New ClassPartitionFAT(ClassData.PartitionLogique)

' le constructeur de la classe PartitionFAT
Public Sub New(Partitionlogique As ClassPartitionLogique)

BytesPerSector = Partitionlogique.BytesPerSector
LettrePartition = Partitionlogique.LettrePartition
DiskPhysique = Partitionlogique.DiskPhysique
SysFich = Partitionlogique.SysFich
OffsetPartition = Partitionlogique.OffsetPartition
VolumeName = Partitionlogique.VolumeName
TypePartitionGpt = Partitionlogique.TypePartitionGpt

End Sub


Quand j'explore mon Pc j'obtiens une List(of ClassData.ClassPatitionLogique)
Lorsque je sélectionne une partition j'ai donc un objet PartitionLogique
Selon le système de fichiers je me sers de PatitionFAT ou PartitionNTFS avec un constructeur qui prend PartitionLogique en paramètre

Les faits des 2 instances de PartitionLogique ne me gène pas . Il me sert même car c'est dans PartitionLogique que je recherche la liste des clusters libres . Et cette liste existe en FAT et en NTFS et je m'en sers dans d'autres feuilles du projet avec PartitionLogique comme objet
Je ne me sers pas du polymorphisme dans ma liste d'origine

Ceci m'a permis de faire de l'héritage entre PartitionLogique et ses 2 classes filles ( PartitionFAT et PatitionNTFS)

Donc sujet résolu : un grand merci Whismeril
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
22 avril 2017 à 18:56
de rien
0
Rejoignez-nous