【问题标题】:Why is this class better suited to be abstract instead of concrete?为什么这个类更适合抽象而不是具体?
【发布时间】:2019-10-09 02:09:30
【问题描述】:

为什么这个 Student 类(一个创建新学生对象并为其分配唯一 ID 的类)更适合作为抽象类而不是具体类?每个创建的学生对象都被分配了自己唯一的 ID 权限,那么为什么不只在类本身内部实现graduate() 方法,而不是由继承的类实现呢?

public abstract class Student {
    protected int id;
    private static int lastID = 0;
    protected String firstName;
    protected String familyName;

    public Student(String firstName, String familyName) {
        id = Student.nextID();
        this.firstName = firstName;
        this.familyName = familyName;
    }

    private static int nextID() {
        return ++lastID;
    }

    public String toString() {
        return firstName + " " + familyName;
    }

    // Generate string containing graduation information
    public abstract String graduate();
}

【问题讨论】:

  • Student 有什么子类吗?他们是如何不悔改抽象方法的?
  • 如果没有对设计的其余部分有更广泛的了解,您将无法判断这一点。是否有各种各样的学生仍然共享部分实际代码?
  • 你为什么认为它是?这将取决于它应该如何使用。
  • 我不确定我是否正确理解了您的问题,也许可以提供更多信息,为什么您会问这个问题。这取决于上下文。如果您打算创建也可以毕业但需要不同实现的 Student 子类,那么抽象实现是好的。如果性能没有问题并且您不确定是否需要子类,则将函数抽象化并提供默认实现可能是最通用的解决方案。
  • 只是想知道:您的问题是否得到解答(也许考虑接受),还是您需要更多信息?

标签: java inheritance abstract-class abstract abstraction


【解决方案1】:

重点是:如果您有不同的 Student 子类,每个子类都有一个不同的区分属性,比如“主要类”。

因此:此模型仅允许具有不同“主要课程”的学生,因此防止创建缺少相应“属性”的“原始”学生对象将是有意义的。

但您必须了解:决定您如何准确构建对象模型的原因(哪些类是抽象的,哪些不是)来自您打算建模的内容。

换句话说:编写this 抽象Student 类的人认为完全按照这样的方式进行操作将最符合基本要求。在不同的上下文中,Student 可能很不抽象。

【讨论】:

    【解决方案2】:

    由于您将拥有的学生类型,通常将学生课程写成抽象的。即高中、大学等。

    有些学生有其他人没有的信息。例如,一个大学生可能有一个高中生没有的宿舍号码。抽象类让您有更大的灵活性,而不是为学生锁定单一的定义。

    【讨论】:

      猜你喜欢
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 2012-08-20
      • 1970-01-01
      相关资源
      最近更新 更多