Когда бы вы создали объект из унаследованного класса? - PullRequest
0 голосов
/ 11 июня 2018

В настоящее время я изучаю наследование и полиморфизм, и меня немного смущает вопрос о том, где вы хотите создать объект Person типа Student?предполагая следующий код:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Gender { get; set; }
}

class Student : Person
{
    public int YearOfStudy { get; set; }
    public string Course { get; set; }
    public string PredictedGrade { get; set; }
}

Теперь ищем в сети, здесь есть несколько вариантов создания объекта:

Person p = new Person();
Student s = new Student();
Person ps = new Student();

Первые объекты позволяют мне установить имя, возрасти пол, в то время как второй позволяет мне установить эти 3, а также годы обучения, курс и прогнозируемый класс.Но я не уверен, что третий объект позволяет мне делать?Я все еще могу установить все 6 параметров, однако я могу использовать только атрибуты, заданные в классе Person?Любое объяснение о правильном использовании третьего объекта будет оценено.

Спасибо

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Третий объект не имеет смысла.В вашем примере вы должны использовать просто:

Student s = new Student();

Где вы сможете получить доступ к свойствам от Student и Person.

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

public class Employee : Person
{
   public decimal salary { get; set;}
}

Поэтому при создании экземпляра Employee у вас будут свойства из Person.

0 голосов
/ 11 июня 2018

Поскольку класс Student является производным от класса Person, любой объект Student также является объектом Person.Таким образом, запись Person ps = new Student(); означает, что мы объявляем переменную ps типа Person и создаем ее экземпляр как Student.Его можно использовать, если у вас есть метод, который принимает Person объект в качестве параметра, например,

 public void Foo(Person p) { if(p.Age > 21) Console.WriteLine("OK to drink!"); }

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

public void Foo(Student s) {if(s.YearOfStudy == 1) Console.WriteLine("Freshman");}

вы должны использовать Student s = new Student();.

0 голосов
/ 11 июня 2018

Пока не думайте об этом как Person ps = new Student().

Реальное преимущество заключается в возможности абстрагировать общий код для всех типов Person.Таким образом, ваши методы могут потребовать Person, потому что это все, что нужно, и будет работать с любым типом человека, который вы создаете, например Janitor, Teacher и т. Д.

var myStudent = new Student()

VerifyAge(myStudent);
VerifyYearOfStudy(myStudent);

public bool VerifyAge(Person person)
{
    return person.Age < 200;
}

public bool VerifyYearOfStudy(Student student)
{
    return student.YearOfStudy <= DateTime.Now.Year;
}

Чтобы устранить некоторую путаницуединственный раз, когда вы действительно объявляете основание в методе, это когда вы действительно хотите указать, что эта переменная предназначена только для использования в качестве этого конкретного типа.Думайте об этом, как будто вы объявили свою переменную, используя интерфейс.Конечно, я работаю с экземпляром Student, но я работаю с ним только как экземпляр Person или как IPerson.

Обычно в качестве переменной в методе вы этого не сделаете, потому чтов значительной степени стандарт defacto - это просто использовать var для всего в наше время.Если вы делаете выбор для определения Person, обычно это свойства, возвращаемые значения метода и параметры метода.Локальная переменная не очень важна.

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