internal class Program { private static void Main(string[] args) { var student = new Student(22, "Jan Kowalski", new() { 4, 4, 5 }); student.Hello(); var elementaryStudent = new ElementaryStudent(14, "Anna Nowak", new() { 5, 5, 5 }, 32); elementaryStudent.Hello(); // Elementary Student nie implementuje swoje Hello, więc wywoła się metoda z klasy bazowej var universityStudent = new UniversityStudent(23, "John Doe", new() { 3, 3, 3 }, "C# jest super"); universityStudent.Hello(); // ta klasa robi override metody virtualnej, więc wywoła się implementacja z klasy pochodnej } } public class Student { public int Age { get; set; } public string Name { get; set; } public List Grades { get; set; } public Student(int age, string name, List grades) { Age = age; Name = name; Grades = grades; } public virtual void Hello() { Console.WriteLine($"My name is {Name}. My age is {Age}. My best grade is {Grades.Max()}"); } } public class ElementaryStudent : Student { public int UniformSize { get; set; } public ElementaryStudent(int age, string name, List grades, int uniformSize) :base(age, name, grades) { UniformSize = uniformSize; } } public class UniversityStudent : Student { public string ThesisTitle { get; set; } public UniversityStudent(int age, string name, List grades, string thesisTitle): base(age, name, grades) { ThesisTitle = thesisTitle; } public override void Hello() { Console.WriteLine($"I'm from university. My thesis title is {ThesisTitle}"); } }