SlowCoach Ответов: 2

Используйте список для добавления и перебора объектов в классе


Привет Действительно застрял с этим, и я новичок в ООП. Я новичок, создал класс и хочу хранить каждый объект в списке, а не в массиве. Список даст мне больше методов для игры, и мне не нужно указывать его размер. Вот что у меня есть:
Public Class STUDENT
       'establish properties / members
       Public firstname As String
       Public surname As String
       Public DOB As Date
   End Class

   'declare a variable of the data type above to put aside memory

   Dim students As New List(Of STUDENT)
   Dim tempStudent As New STUDENT()


   Sub Main()
       Dim selection As Char
       While selection <> "C"
           Console.WriteLine("Welcome to student database")
           Console.WriteLine("Number of tempStudent: " & students.Count)
           Console.WriteLine(" (A) Add a student")
           Console.WriteLine(" (B) View a student")
           Console.WriteLine(" (C) Quit")


           selection = Console.ReadLine.ToUpper

           If selection = "A" Then

               Console.Write("Please enter a firstname: ")
               tempStudent.firstname = Console.ReadLine()

               Console.Write("Please enter a surname: ")
               tempStudent.surname = Console.ReadLine()

               Console.Write("Please enter a date of birth: ")
               tempStudent.DOB = Console.ReadLine()

               students.Add(tempStudent)
               Console.WriteLine("Student entered!")
               Console.ReadLine()
               Console.Clear()


           ElseIf selection = "B" Then

               For Each temp In students
                   Console.WriteLine("Student firstname: " & temp.firstname)
                   Console.WriteLine("Student surname: " & temp.surname)
                   Console.WriteLine("Student date of birth: " & temp.DOB)
                   Console.ReadLine()
               Next
               Console.Clear()
           Else
               'Quit the application
               End

           End If
       End While


Программа запустится и позволит мне сохранить, например, 2 записи, но когда я использую для каждой (нажав опцию B), она показывает только последнюю запись, которую я ввел.

Что я уже пробовал:

Не могу найти простой пример в интернете, который я мог бы адаптировать или помочь мне понять, как список будет работать в этом контексте. Не могу быть уверен, что запись перезаписывается из него Мой для каждого цикла не имеет индекса, так сказать

2 Ответов

Рейтинг:
13

F. Xaver

вы всегда держите ссылку на свой объект в tempStudent
таким образом, вы не создаете новый объект, а только меняете свойства одного и того же объекта


пошевеливайся

Dim tempStudent As New STUDENT()


здесь

If selection = "A" Then
     Dim tempStudent As New STUDENT()
     Console.Write("Please enter a firstname: ")


таким образом, вы создаете новый объект каждый раз, когда добавляете нового ученика.


SlowCoach

Ф. Ксавер Арррргхххх. Огромное спасибо. Я потратил на это несколько часов. Очень благодарен. Надеюсь, кто-то там задастся тем же вопросом и получит отправную точку

Sergey Alexandrovich Kryukov

Хороший улов, 5.
Код исследователя имеет много проблем; одна из них-жестко закодированные "А", "В", " С " и тому подобное. Это не ремонтопригодно. Одним из решений было бы использование типа перечисления или, по крайней мере, набора явно определенных констант вместо них непосредственные константы Код должен быть аккуратным, ничего не должно повторяться и так далее...
—СА

SlowCoach

Я думаю, что если вы не введете букву, все пойдет ужасно неправильно, и у меня, вероятно, возникнет пара проблем с кастингом, но как вы представляете себе перечислители или константы в качестве помощи? Я бы подумал, что, объявив их таким образом, мне все равно понадобится оператор select case или if, ELSEIF Else? Пожалуйста, не могли бы вы объяснить?

Sergey Alexandrovich Kryukov

Разве это не очевидно? Вы определяете его один раз в одном месте, никогда не повторяйте. Каждое значение перечисления преобразуется в строку через .ToString () или .ToString ().ToUpper (), в зависимости от того, что вы хотите. Это делает код ремонтопригодным. Кроме того, вы можете иметь структуру данных, непосредственно связывающую ввод с действиями.
—СА

Sergey Alexandrovich Kryukov

Я подробно ответил на этот вопрос в решении 2, см.
—СА

Рейтинг:
10

Sergey Alexandrovich Kryukov

Ленивица спросил:
Я думаю, что если вы не введете букву, все пойдет ужасно неправильно, и у меня, вероятно, возникнет пара проблем с кастингом, но как вы представляете себе перечислители или константы в качестве помощи? Я бы подумал, что, объявив их таким образом, мне все равно понадобится оператор select case или if, ELSEIF Else? Пожалуйста, не могли бы вы объяснить?
Пожалуйста, смотрите мой комментарий к решению номер один в ответ на этот вопрос. Он думал, что это должно быть совершенно очевидно.

На самом деле речь идет не о том, чтобы иметь "Если" или "переключиться". Но…

Даже те "switch" от "if", строго говоря, здесь не должно быть. Опять же, все это в основном вопрос ремонтопригодности кода и способов избежать повторения одних и тех же вещей снова и снова. Вы понимаете, что существуют универсальные шаблоны? словари и другие данные структуры, другие средства абстракции. Как показывает опыт, если вы видите слишком много «если» и «переключено», это хороший признак того, что вы делаете что-то не так, и вам следует подумать о более эффективных способах, более абстрактных. Возьмите ваш случай. Как вы можете инициировать некоторые действия в ответ на введенную строку / символ? Легко! Вы можете создать словарь, с первым универсальным параметром, ключом, который станет строкой или символом, а второй, значением, станет экземпляр делегата определенного типа. Достаточно один раз построить такой механизм. Все это объясняется в моей статье на эту тему:Диспетчер Динамических Методов.

Теперь я предлагаю вам сделать еще один шаг и подумать о чем-то, что не имеет отношения к этой проблеме. Зачем тебе вообще эти клавиши «А», «В» и «С»? Потому что вы пытаетесь создать интерактивное консольное приложение. Это хорошая идея? Как правило, но. Посмотрите на известные консольные приложения. Практически все они вообще не имеют интерактивного ввода (есть некоторые исключения, но их очень мало). Почему так? Прежде всего потому, что такие приложения очень неудобны. Сделайте небольшую ошибку, и вам придется снова ввести данные. Вместо этого такие приложения обычно основаны на параметрах командной строки. Командная строка может быть относительно длинной, но когда вы делаете ошибку, цена ошибки очень мала: большинство приложений запускают другие приложения из командной строки, командные интерпретаторы (например, CMD.EXE, но есть гораздо больше "командиров") ) всегда дает вам возможность быстро повторить последние команды. Вы просто исправляете одного или двух персонажей, если допустили ошибку. В другой моей статье предлагается очень удобный, хорошо обслуживаемый, простой и легкий в использовании способ синтаксического анализа командной строки:Утилита командной строки на основе перечисления (опять перечисления, кстати). Интерактивные консольные приложения просто не нужны, они слишком ужасны, чтобы быть удобными.

Наконец,для более сложного ввода лучше всего подходит графический интерфейс.

—СА