这是我正在谈论的一个非常基本的例子。我们有 Student、Enrollment 和 Club,其中 StudentEnrollment 和 StudentClub 代表了 Students->Enrollment 和 Students->Club 之间的多对多关系。我正在使用 EFCore 作为数据模型,如果有帮助的话。
这两个类的一个基本方法是将学生添加到注册或俱乐部,如果他们还不是相应对象的一部分(请参阅 StudentEnrollment.AddStudent 和 StudentClub.AddStudent)。这些方法的功能几乎相同,但类的名称和需要比较的属性的名称不同。
有没有办法创建一个共享方法/类/继承/接口/泛型/某些东西,尽管属性/类名称不同,但只需编写一次,并由两个类使用?
基本示例代码(带有一些伪代码):
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
}
public class Enrollment
{
public int EnrollmentId { get; set; }
public string EnrollmentName { get; set; }
}
public class StudentEnrollment
{
public int EnrollmentId { get; set; }
public int StudentId { get; set; }
public void AddStudent(Student student, Enrollment enrollment)
{
//pseudocode
if (!exists (Where(enrollment.EnrollmentId == this.EnrollmentId && student.StudentId == this.StudentId)))
{
// add student enrollment
}
}
}
public class Club
{
public int ClubId { get; set; }
public string ClubName {get; set;}
}
public class StudentClub
{
public int ClubId { get; set; }
public int StudentId { get; set; }
public void AddStudent(Student student, Club club)
{
//pseudocode
if (!exists (Where(club.ClubId == this.ClubId && student.StudentId == this.StudentId)))
{
// add student club
}
}
}
我认为继承不起作用,接口也不起作用。也许是一个通用的,我在那个领域不太擅长?还有别的吗?
考虑继承时要问的问题是两个类之间是否存在“is-a”关系。
很明显,
StudentClub
不是StudentEnrollment
(因为这里的注册是班级注册),反之亦然。
是否有一个共同的概念,即它们都是is-a?您可能会考虑拥有一个
StudentGrouping
一个公共(可能是抽象)基类(或者可能拥有一个它们都继承自的 IStudentGrouping
接口)。
“StudentGrouping”的概念似乎太抽象,无法在继承上花费时间。您是否有任何理由考虑在代码中考虑使用多态 StudentGrouping
实例的集合。
IStudentGrouping
接口(实现
ICollection<Student>
)提供案例,这将清楚地表明两者都是学生的集合(并允许使用 集合初始化模式) . 也就是说,我不知道与让两个类简单地实现
ICollection<Student>
相比,这是否会给你带来很多好处。我建议就这样吧(当然,这只是一个意见,Stackoverflow 讨厌意见)。