0

我必须构建一个图书馆管理系统,并且在尝试实现用户类型或配置文件时遇到了问题。我已经有了一个超类用户和另外两个用户子类,学生和教师,每个子类都有自己的“特征”。问题是我必须根据他们可以借的书籍数量和他们可以保留书籍直到他们必须归还书籍的时间来实现 7 种类型的用户(5 种类型的学生和 2 种类型的文员)。这些是班级之间仅有的两个区别。

你将如何实现这一点?遗产?我正在寻找一种聪明的方法来实现这一点,我很想听听你对此的看法。

非常感谢你。

4

2 回答 2

2

作为一个好的经验法则,你在项目规范中看到一个名词的任何地方,它都是一个类的好候选。如果这些名词在项目规范中有关系,那么它们可能在你的代码中也有关系。

您的所有人员都将属于 a 的类别,User因此也许这应该是他们都将继承的接口。从这里开始,它们似乎分为两类,Student也许Staff这些也应该是抽象类/接口。然后你就有了 7 个具体的类。2继承Staff和5继承Student

所以你最终会得到这样的东西.. 在此处输入图像描述

当然,这个设计取决于每个User人必须做什么,每个人Staff/Student必须做什么,但我会把非常具体的细节留给你。

于 2012-04-25T00:04:21.813 回答
1

每个人都有一个“班级”,这确实限制了您的设计;因为,如果要添加学生或老师,则需要开始编写新课程。

类是模板,每个模板都用于构造一个“类的实例”或更具体地说是一个“实例”。一个模板通常用于构造多个类(尽管一个类不必多次使用,使用一次(或根本不使用)就可以了)。

所以你可以做

public class Student {

  private String name;

  public Student(String name) {
    this.name = name;
  }

  public string getName() {
    return this.name;
  }

}

public class Staff {

  private String name;

  public Staff(String name) {
    this.name = name;
  }

  public String getName() {
    return this.name;
  }

}

正如你所看到的,员工和学生之间会有很多重复。 getName(), getAge(), getPhoneNumber(),getAddress()等可以很容易地应用于两者,这在这种结构下意味着您必须为Student和复制这些方法Staff

工作人员和学生有什么共同点?两者都是People,而且很多常用的方法对所有人来说都是通用的。

public class Person {

  private String name;

  public Person(String name) {
    this.name = name;
  }

  public String getName() { 
    return this.name;
  }
}

public Staff extends Person {

  public void teachClass(Class class) {
    ...
  }

}

public Student extends Person {

  public void attendClass(Class class) {
    ...
  }

}

这种设计还产生了其他问题,因为它暗示职员不是学生,学生不是职员。在现实世界中,有时员工会报名上课,而学生可以担任教学角色(想想老师的助手)。

最灵活的方法实际上并没有在学生和员工之间产生结构上的差异,而是通过能力来区分两者。

 public class Person {

   public Person(String name) {
     ...
   }

   public void canTeach(Course course) {
     teaching.add(course);
   }

   public void attending(Course course) {
     attending.add(course);
   }

   public boolean isStaff() {
     return !teaching.isEmpty();
   }

   public boolean isStudent() {
     return !attending.isEmpty();
   }

 }

但是,这种结构与您在课堂上展示的示例完全不同,它回避了您真正应该学习的有关继承的课程。

于 2012-04-25T00:42:31.240 回答