Problème héritage entre classe [Résolu]

Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
-
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. 
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
12374
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
1
Merci
Bonsoir

quand tu explores les partitions, tu ajoutes une partitionNtfs ou une partition?

Merci Whismeril 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 103 internautes ce mois-ci

vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
-
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é
Whismeril
Messages postés
12374
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
> vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
-
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.
vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
> Whismeril
Messages postés
12374
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
-
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
vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
> vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
-
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
Whismeril
Messages postés
12374
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
> vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
-
de rien
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.