如何无需手动创建继承类实现C#自动添加新学生?
解决思路:无需继承,直接创建自定义学生实例
你现在的问题核心是:当前的student类只有一个固定值的无参构造函数,所以每次创建出来的都是同一个学生。其实完全不需要用继承来解决不同学生的问题——继承是用来区分不同类型的学生(比如本科生、研究生),而不同的学生个体只需要创建不同的实例即可。
下面是具体的改进步骤和代码示例:
1. 给类添加带参数的构造函数
我们可以新增一个接收参数的构造函数,这样在创建学生对象时,就能直接传入该学生的专属信息,不用每次都用默认值。同时可以保留无参构造函数作为"模板学生"使用。
2. 用属性替代公共字段(C#最佳实践)
直接把字段设为public虽然简单,但在实际开发中更推荐用属性(get; set;)来封装数据,这是面向对象的基础规范,也方便后续扩展。
3. 改进后的完整代码
using System; using System.Collections.Generic; using System.Linq; // 推荐类名使用帕斯卡命名法:Student(首字母大写) class Student { // 用属性替代公共字段,符合C#封装规范 public string Studentnummer { get; set; } public string Naam { get; set; } public string Postcode { get; set; } public string Telefoonnummer { get; set; } public List<string> Vakken { get; set; } // 无参构造函数:保留默认模板 public Student() { Studentnummer = "S101010"; Naam = "Voornaam Achternaam"; Postcode = "1111AT"; Telefoonnummer = "31+ 0571 123456"; Vakken = new List<string> { "Voorbeeld vak 1", "Voorbeeld vak 2" }; } // 带参数的构造函数:支持创建自定义学生 public Student(string studentnummer, string naam, string postcode, string telefoonnummer, List<string> vakken) { Studentnummer = studentnummer; Naam = naam; Postcode = postcode; Telefoonnummer = telefoonnummer; // 这里的空引用防护:避免传入null导致后续操作出错(入门阶段可以先理解逻辑) Vakken = vakken ?? new List<string>(); } // 简化ToString方法,让输出更易读 public override string ToString() { return $"Studentnummer: {Studentnummer}\nNaam: {Naam}\nPostcode: {Postcode}\nTelefoonnummer: {Telefoonnummer}\nVakken: {string.Join(", ", Vakken)}"; } } class Program { static void Main(string[] args) { // 创建默认模板学生 Student standaardStudent = new Student(); Console.WriteLine("Standaard student:"); Console.WriteLine(standaardStudent.ToString()); Console.WriteLine("\n------------------------\n"); // 创建第一个自定义学生 List<string> mariasVakken = new List<string> { "Wiskunde", "Nederlands" }; Student maria = new Student("S123456", "Maria Janssen", "2222BT", "31+ 06 12345678", mariasVakken); Console.WriteLine("Maria's gegevens:"); Console.WriteLine(maria.ToString()); Console.WriteLine("\n------------------------\n"); // 创建第二个自定义学生 List<string> jansVakken = new List<string> { "Informatica", "Engels" }; Student jan = new Student("S654321", "Jan de Vries", "3333CT", "31+ 06 87654321", jansVakken); Console.WriteLine("Jan's gegevens:"); Console.WriteLine(jan.ToString()); } }
4. 关键说明
- 不需要继承的原因:继承的作用是复用不同类型对象的共性(比如
UndergraduateStudent和GraduateStudent可能有不同的属性或方法),而你需要的是同一类型(普通学生)下的不同个体,直接通过构造函数传参创建实例就足够了。 - 帕斯卡命名法:C#中类名、属性名通常用帕斯卡命名(首字母大写),这是行业通用的编码规范,能让代码更易读。
- 空引用防护:在带参数的构造函数里,我们用
vakken ?? new List<string>()确保即使传入的课程列表为null,也不会出现空引用异常,这是入门阶段可以逐步掌握的小技巧。
运行上面的代码,你就能看到三个不同的学生实例被创建并输出,完全不需要写任何继承类!
内容的提问来源于stack exchange,提问作者Venepskeuten
相关产品推荐
相关产品推荐

