0
votes

Nouveau à OOP - Utilisation de la liste (de T) ou de la collection ()

Je ne suis pas positif que j'utilise code> code> correctement. Je suis très nouveau à OOP et beaucoup de la documentation sur MSDN suppose, je comprends le lingo que je ne fais pas toujours.

J'ai créé les classes ( itemData ​​code> et matériaux code >) Dans le cadre d'une nouvelle demande de création d'articles. Les deux classes ont de nombreuses autres propriétés, mais elles ont été simplifiées pour cet exemple. P>

Public Class CreateNewItem
    Public NewItem As New ItemData
    Private Sub AssignMaterialID(FamilyID As String)
        Dim MaterialCount As Long = NewItem.Material.LongCount

        NewItem.Material.Add(MaterialCount + 1)
        NewItem.Material(MaterialCount + 1).MaterialID = "ITEM000101"
        NewItem.Material(MaterialCount + 1).UnitofMeasure= "CASE"        
    End Sub
EndClass


6 commentaires

Il y a mille choses qui pourraient être dites à ce sujet. Quelques: 1) Ceci: Public FamayID en tant que chaîne n'est pas une propriété, est un champ. Vous voudrez peut-être le transformer dans une propriété auto réadonnée: Public Readonly Propriété familyId comme chaîne , il ne peut donc être défini que dans le constructeur de classe. Probablement la même chose pour le champ (code>. 2) Ceci: Public _MaterialID en tant que chaîne est un champ de support, utilisé par la propriété matériauid . Il doit être déclaré privé (non accessible de l'extérieur de la classe). Le générateur de code aurait dû faire cela pour vous, lorsque vous avez entré Prop + onglet .


3) Lorsque vous souhaitez ajouter un nouvel objet de matériau à la liste des matériaux de la classe itemData , vous devez ajouter un nouvel objet objet , pas un numéro : c'est une liste (de matériau) , pas une liste (de long) . Créez un nouveau matériau: Dim ItemAaterial en tant que nouveau matériau () avec {.maaterialid = "[Quelqu'un ID]" ", .Unitofmeasure =" cas "(...)} . Ensuite, ajoutez-le: newitem.materials.add (itemmaterial) 4) UnitOfmeAsure devrait être un énumérateur (...)


Je vous remercie. J'ai ajusté mes publicités publiques à des propres privées car la justification a du sens; J'ai toujours besoin de penser à l'autre partie RE: Constructeur de classe (Termes Google pour demain).


Nope . Les propriétés doivent être Public , les définir privé défaite le but d'avoir des propriétés dans ce cas. Readonly et privé , deux choses différentes. Le constructeur de classe est tout simplement Sub Nex () . Vous pouvez avoir un constructeur comme celui-ci: Sub NOUVEL PUBLIC (ID en tant que chaîne, une description en tant que chaîne) , vous ne pouvez donc créer qu'une nouvelle classe si vous avez déjà une pièce d'identité et une description à attribuer à la nouvelle. objet. Dans le contrateur, vous définissez ensuite le famautoryid et description Propriétés. Depuis qu'ils sont réadis, ils ne peuvent être définis que dans le constructeur de classe.


Je choisirais un nom différent pour votre liste (de matériel) dans votre classe ItemData. Peut-être que les matériaux comme le pluriel indiqueraient une collection de quelque nature que ce soit.


Merci encore. Cela fonctionne comme prévu. Une partie de la hangup pour moi était que je n'ai pas toutes les valeurs des propriétés à l'époque que je crée du matériel et même en utilisant votre méthode (jusqu'à ce que je puisse passer du résultat), je ne pouvais pas voir où un index a été attribué pour se référer plus tard quand je Je voulais remplir ces détails. Je suis bon maintenant, merci beaucoup!


3 Réponses :


-1
votes

Bonjour essayer le tableau au lieu de collections, En outre, il semble que vous ayez oublié le type de la variable

Dim matériau () en tant que chaîne

espoir fonctionne bien ...


2 commentaires

Je ne pense pas que Array me permet d'attribuer des propriétés, ce qui signifie que mon programme devra garder une trace de l'élément rempli ou non. Ai-je tort?


Lorsque vous créez un tableau d'un type (n'importe quel type), vous pouvez toujours utiliser n'importe quelle propriété de cette classe. Vous pouvez utiliser une gamme de "itemData" afin que chaque élément de la matrice ait son sur la collecte de matériaux, vous pouvez faire ce que vous voulez.



0
votes

Vous devez créer une instance de la classe de matériaux et la définir, comme ceci.

    NewItem.Material.Add(New Material With {.MaterialID = "ITEM000101", .UnitofMeasure = "CASE"})
    NewItem.Material.Add(New Material With {.MaterialID = "ITEM000102", .UnitofMeasure = "BOX"})


0 commentaires

0
votes

La meilleure option à mon avis serait de définir le constructeur d'accepter des arguments pour renseigner des champs dans la classe code> matériau CODE>, puis créer facilement des objets et les ajouter à la liste, comme ci-dessous:

Imports System

Module Program
  Sub Main(args As String())
    Dim newItem As New ItemData
    newItem.Material.Add(New Material("ITEM000101", "CASE"))
    ' etc.
  End Sub
End Module

Public Class ItemData
  Public FamilyID As String
  Public Description As String
  Public Material As New List(Of Material)
End Class

Public Class Material
  ' All your code can be simplified
  Public Property MaterialID As String
  Public Property UnitofMeasure As String

  Public Sub New(MaterialID As String, UnitofMeasure As String)
    Me.MaterialID = MaterialID
    Me.UnitofMeasure = UnitofMeasure
  End Sub
End Class


2 commentaires

Merci. J'ai fait simplifier la classe de matériaux. Je ne suis pas sûr de savoir pourquoi je pensais que cela avait besoin de l'ensemble de l'obtention et de la création (c'est ma nouveauté à OOP montrant). Quant au constructeur, il existe des lots et de nombreux attributs - et non seulement les deux que j'ai énumérées - et les attributs sont ajoutés à différents moments via le processus de création d'éléments, certains d'entre eux sont facultatifs, etc. J'ai une solution de travail, mais en utilisant toutefois tout L'aide que j'ai reçue ici. Merci à tout le monde!


@ Mavryk76 Vous êtes les bienvenus. Vous devriez marquer la réponse, vous pensez vous aider le plus, comme accepté (coche verte à gauche).