c #, проблема с конструктором, использующим переменную как имя нового объекта - PullRequest
0 голосов
/ 25 мая 2018

Я не хочу, чтобы все объекты имели одинаковое имя.Я пытаюсь использовать переменную (введенную пользователем) для создания объекта.

Почему я не могу этого сделать?:)

public class Student
{
   public static int Count = 0;
   public int ID   { get; set; }
   public string Name { get; set; }
   Dictionary<int, Student> students = new Dictionary<int, Student>();
   public Student (string name, int id)
   {
      Name = name;
      ID = id;
   }
   public static void addStudent()
   {
      Student.Count++;                                // incrementing value for new student id.
      Console.Write("Please enter student's name: "); // grabbing input from user.
      string studentName = Console.ReadLine();
      Console.WriteLine("Student ID value: {0}", Student.Count); // for testing.
      int studentID = Student.Count;
      /* Student (studentName) = new Student (studentName, studentID) -- The issue is with this line*/
      Student added = new Student(studentName, studentID) // using this as a temp for now.
         {
            Name = studentName,
            ID = studentID
         };
   }
}

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Один из способов может быть:

static class Program
{
    public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public Student(int ID, string Name)
        {
            this.Name = Name;
            this.ID = ID;
        }
    }

    public class Students : List<Student>
    {
        public void Add()
        {
            Console.Write("Please enter student's name: ");
            string studentName = Console.ReadLine();
            int studentID = base.Count + 1;
            Console.WriteLine("Student ID value: {0}", studentID);
            base.Add(new Student(studentID, studentName));
        }
    }

    static void Main()
    {
        Students students = new Students();
        students.Add();
    }
}

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

public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
    public Student(int ID, string Name)
    {
        this.Name = Name;
        this.ID = ID;
    }
    public static List<Student> AllStudents = new List<Program.Student>();
    public static void AddStudent()
    {
        Console.Write("Please enter student's name: ");
        string studentName = Console.ReadLine();
        int studentID = AllStudents.Count + 1;
        Console.WriteLine("Student ID value: {0}", studentID);
        AllStudents.Add(new Student(studentID, studentName));
    }
}

Но в качестве примера модели ООП в реальной проблеме, список студентов может понадобиться в классе, тогда вы должны назначить всех студентов в классе.предположим, что вы можете определить классы следующим образом:

class Student
{
    public int id;
    public string name;
}

class ClassRoom
{
    public int classId;
    public string className;
    public string lessonName;
    public DateTime startDate, endDate;
    .
    .
    .
    public List<Student> students = new List<Student>();
}

void Main()
{
    Student Adam = new Student(11, "Adam");
    Student Hussein = new Student(12, "Hussein");
    Student John = new Student(13, "John");

    ClassRoom Class1 = new ClassRoom{classId:1, className: "Class1", lessonName="Math"};
    Class1.students.Add(Adam);
    Class1.students.Add(Hussein);

    ClassRoom Class2 = new ClassRoom{classId:2, className: "Class2", lessonName="Physics"};
    Class1.students.Add(Adam);
    Class1.students.Add(John);
}

Вы можете проверить, является ли student.id дублированным или нет, и так далее ... это не связано с концепциями ООП.

0 голосов
/ 25 мая 2018

Вы пытаетесь разместить всех студентов в словаре?Если это так, вы можете сделать словарь статическим.В противном случае каждый экземпляр ученика будет иметь свой собственный уникальный словарь.Хотя я бы отделил словарь от ученика.

Попробуйте:

public class Student
{
    public static int Count = 0;
    public int ID { get; set; }
    public string Name { get; set; }
    public static Dictionary<int, Student> students = new Dictionary<int, Student>();
    public Student(string name, int id)
    {
        Name = name;
        ID = id;
    }
    public static void addStudent()
    {
        Student.Count++;                                // incrementing value for new student id.
        Console.Write("Please enter student's name: "); // grabbing input from user.
        string studentName = Console.ReadLine();
        Console.WriteLine("Student ID value: {0}", Student.Count); // for testing.
        int studentID = Student.Count;
        /* Student (studentName) = new Student (studentName, studentID) -- The issue is with this line*/
        Student added = new Student(studentName, studentID);
        bool IDInUse = students.ContainsKey(added.ID);
        if(IDInUse)
        {
            students[added.ID] = added;
        }
        else
        {
            students.Add(added.ID, added);
        }

    }
}

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

Я предлагаю создать отдельный класс для словаря.

public class Student
{
    private string Name;
    public Guid ID { get; private set; }

    public Student(string name)
    {
        this.Name = name;
        this.ID = new Guid();
    }
}

public class StudentDirectory
{
    public Dictionary<Guid, Student> Directory { get; private set; }

    public StudentDirectory() : this(new Dictionary<Guid, Student>())
    { }

    public StudentDirectory(Dictionary<Guid, Student> directory)
    {
        this.Directory = directory;
    }

    public void AddStudent(Student entry)
    {
        bool idExists = Directory.ContainsKey(entry.ID);
        if(idExists)
        {
            Directory[entry.ID] = entry;
        }
        else
        {
            Directory.Add(entry.ID, entry);
        }
    }

    public void AddStudent()
    {
        Console.WriteLine("Enter the new stuent's name.\n");
        string name = Console.ReadLine();
        Student entry = new Student(name);
        AddStudent(entry);
    }
}

GUID (глобально уникальный идентификатор) поможет предотвратить перезапись.Кроме того, мы можем добавить существующих студентов или создать их с помощью того же метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...