Создание объекта внутри другого объекта? (C #) - PullRequest
0 голосов
/ 04 июля 2018

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

Я делаю этот курс C # OOP edx, где мне нужно было сделать 5 классов (студент, преподаватель, UProgram, степень, курс) в разных файлах классов, и вот эта задача:

a pic that was included

  1. Создание объекта UProgram с именем Information Technology.
  2. Создание объекта степени, например, бакалавра, вместо объекта UProgram.
  3. Создание объекта Course под названием softeng внутри объекта Degree.
  1. Было сделано, (надеюсь) никаких проблем с этим
  2. и 3. - эх.

Как я думал (помните, я новичок): Сначала я подумал о вложенных классах, но я не был уверен в том, как они работают, и не думал, что смогу поместить классы в разные файлы, так как они должны быть вложенными (?) А потом я попробовал что-то с конструктором, но не мог понять, как я мог заставить его работать

Так что теперь моей последней попыткой было создание методов внутри классов (кроме учителей и учеников, поскольку у них не будет ничего «принадлежащего им»), как у курса есть ученики и учителя, принадлежащие ему

Итак, у меня есть метод в виде (- скажем, мы в классе Degree, у нас есть метод для создания нескольких курсов для этой степени -):

public void Newcourse(string Cname, Course sth)
{
    sth = new Course();
    sth = Cname;
}

И прежде чем я смогу его использовать, я должен написать

Course softeng = new Course();

строка aka сделать экземпляр класса Course, прежде чем я смогу выполнить 3. пункт задачи

Весь код:

UProgram.cs

public class UProgram
{
    public void Newdegree(string Dname, Degree sth)
    {
        sth = new Degree();
        sth.Dname = Dname;
    }
}

Degree.cs

public class Degree : UProgram
{
    public string Dname { get; set; }
    public void Newcourse(string Cname, Course sth)
    {
        sth = new Course();
        sth.Cname = Cname;
    }
}

Course.cs

public class Course : Degree
{
    public void NewTeacher(string FirstName, string LastName, Teacher sth)
    {
        sth = new Teacher();
        sth.FirstName = FirstName;
        sth.LastName = LastName;
    }
    public void NewStudent(string FirstName, string LastName, Student sth)
    {
        sth = new Student();
        sth.FirstName = FirstName;
        sth.LastName = LastName;
    }
    public string Cname { get; set; }
}

Teacher.cs

public class Teacher : Course
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Student.cs

public class Student : Course
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Program.cs

class Program
    {
        static void Main(string[] args)
        {
            var Information_Technology = new UProgram();
            Degree bachelors = new Degree();
            Information_Technology.Newdegree("Bachelors", bachelors);
            Course softeng = new Course();
            bachelors.Newcourse("Software Engineering", softeng);
            Teacher t1 = new Teacher();
            softeng.NewTeacher("Colin", "Firth", t1);
            Student s1 = new Student();
            softeng.NewStudent("Mary", "Sue", s1);
            Student s2 = new Student();
            softeng.NewStudent("Joseph", "Jojo", s2);
            Console.ReadLine();
        }
    }

Я знаю - я знаю, это очень запутанно, и я даже не уверен, хорошо это или нет, но это было все, что я мог придумать, и я был бы очень благодарен, если кто-нибудь из вас может помочь мне ( тоном, который не заставит меня плакать)

Спасибо и еще раз, извините за этот беспорядок кода, а, я попробовал

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Всего несколько комментариев:

У меня большие сомнения, что вам нужно какое-то наследство здесь. Например: Студент: курс - я сомневаюсь, что «Студент - это курс» :). Таким образом, вам, вероятно, нужна какая-то композиция здесь. Я не знаю (и не могу вспомнить), что именно означает бриллиант на вашей картинке, но могу догадаться, что бриллиант с наполнителем - это один предмет (или, по крайней мере, один, не уверен), а пустой означает много предметов. Итак, вот как я бы это сделал (вы можете разбить каждый класс на отдельный файл):

public class UProgram
{
    public string Name { get; set; }
    public Degree Degree { get; set; }

    public UProgram(string name, Degree degree)
    {
        Name = name;
        Degree = degree;
    }
}

public class Degree
{
    public string Name { get; set; }
    public Course Course { get; set; }

    public Degree(string name, Course course)
    {
        Name = name;
        Course = course;
    }
}

public class Course
{
    public List<Teacher> Teachers { get; set; }
    public List<Student> Students { get; set; }
    public string Name { get; set; }

    public Course(string name, List<Teacher> teachers, List<Student> students)
    {
        Name = name;
        Teachers = teachers;
        Students = students;
    }
}

public class Teacher
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Student
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

и основная функция:

static void Main(string[] args)
    {
        var teachers = new List<Teacher>
        {
            new Teacher
            {
                FirstName = "Colin",
                LastName = "Firth"
            }
        };
        var students = new List<Student>
        {
            new Student
            {
                FirstName = "Mary",
                LastName = "Sue"
            },
            new Student
            {
                FirstName = "Joseph",
                LastName = "Jojo"
            }
        };

        var softEngCourse = new Course("Software Engineering", teachers, students);
        var bachelorDegree = new Degree("Bachelor", softEngCourse);

        var technologyProgram = new UProgram("Technology", bachelorDegree);

        Console.ReadLine();
    }

Я все еще не уверен, что это именно то, чего от вас ожидает ваш курс, именно так я и написал бы такой код (с некоторыми небольшими изменениями, но здесь это не имеет значения). Почему так? Потому что почти всегда лучше построить объект в «рабочем» состоянии, когда он явно получает все, что ему нужно, чем создавать необработанный объект, который будет запускаться в «недействительном» состоянии. Во-вторых, обычно лучше не «запекать» значения параметров внутри, а давать потребителю класса (здесь я имею в виду «разработчика») его настройку.

0 голосов
/ 04 июля 2018

Вы неправильно поняли задачу. Course не должен наследоваться от Degree, поскольку Course не является Degree. Вместо этого вам нужно будет определить Course элемент данных в вашем Degree классе. Ни Student, ни Teacher не является Course, поэтому вам не следует наследовать их от Course. Они члены.

Я предполагаю, что Degree может быть достигнуто одним Course.

Я предполагаю, что у Course есть один Teacher.

Я предполагаю, что Course может иметь несколько Students.

Это означает, что у вас есть класс Person, например, так как Student и Teacher являются Person:

public class Person {
    protected String firstName;
    protected String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public Student(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

Теперь наследуйте Teacher от Person:

public class Teacher : Person {
    public Teacher(String firstName, String lastName) : base(firstName, lastName) {
    }
}

и Student:

public class Student : Person {
    public Student(String firstName, String lastName) : base(firstName, lastName) {
    }
}

Теперь давайте определим Course:

public class Course {
    protected Teacher teacher;
    protected List<Student> students;
    protected String name;

    public String getName() {
        return this.name;
    }

    public Teacher getTeacher() {
        return this.teacher;
    }

    public List<Student> getStudents() {
        return this.students;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    public void setTeacher(String firstName, String lastName) {
        this.teacher = new Teacher(firstName, lastName);
    }

    public void addStudent(Student student) {
        this.students.Add(student);
    }

    public void addStudent(String firstName, String lastName) {
        this.students.Add(new Student(firstName, lastName));
    }

    public Course(String name) {
        this.name = name;
        this.students = new List<Student>();
    }
}

Теперь давайте определим Degree:

public class Degree {
    protected String name;
    protected Course course;

    public String getName() {
        return this.name;
    }

    public Course getCourse() {
        return this.course;
    }

    public void setCourse(Course course) {
        this.course = course;
    }

    public void setCourse(String name) {
        this.course = new Course(name);
    }

    public Degree(String name) {
        this.name = name;
    }
}

Теперь вот как вы добились того, чего хотели:

Degree degree = new Degree("mydegree");
degree.setCourse("myCourse");
Course course = degree.getCourse();
course.setTeacher("John", "Smith");
course.addStudent("James", "Doe");
0 голосов
/ 04 июля 2018

Формулировка кажется немного странной, но я полагаю, они просто говорят, что этот класс должен содержать свойство типа, который он должен «содержать», и создавать его экземпляр в конструкторе. Например:

public class Degree
{
    public Degree()
    {
        Course = new Course();
    }

    public Course Course { get; set; }
}

public class Course
{
    public Course()
    {
        Student = new Student();
    }

    public Student Student { get; set; }
}

public class Student
{
    public Student()
    {

    }
}

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

В приведенном выше примере для их создания используются конструкторы, но поскольку они являются общедоступными свойствами, они также могут быть просто созданы извне (в этом случае приведенные выше конструкторы не нужны):

var degree = new Degree();
degree.Course = new Course();
degree.Course.Student = new Student();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...