如何避免具有相似类、相同方法和不同属性名称的重复代码

问题描述 投票:0回答:1

这是我正在谈论的一个非常基本的例子。我们有 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
            }
        }
    }

我认为继承不起作用,接口也不起作用。也许是一个通用的,我在那个领域不太擅长?还有别的吗?

c# inheritance entity-framework-core interface code-duplication
1个回答
0
投票

考虑继承时要问的问题是两个类之间是否存在“is-a”关系。

很明显,

StudentClub
不是
StudentEnrollment
(因为这里的注册是班级注册),反之亦然。

是否有一个共同的概念,即它们都是is-a?您可能会考虑拥有一个

StudentGrouping
一个公共(可能是抽象)基类(或者可能拥有一个它们都继承自的
IStudentGrouping
接口)。

“StudentGrouping”的概念似乎太抽象,无法在继承上花费时间。您是否有任何理由考虑在代码中考虑使用多态 StudentGrouping 实例的集合。

您也许可以为两个类实现 

IStudentGrouping

接口(实现

ICollection<Student>
)提供案例,这将清楚地表明两者都是学生的集合(并允许使用
集合初始化模式
) . 也就是说,我不知道与让两个类简单地实现

ICollection<Student>

相比,这是否会给你带来很多好处。我建议就这样吧(当然,这只是一个意见,Stackoverflow 讨厌意见)。

    

© www.soinside.com 2019 - 2024. All rights reserved.