【问题标题】:Using a class constructor to create object arrays of 2 different types使用类构造函数创建 2 种不同类型的对象数组
【发布时间】:2017-01-19 07:00:09
【问题描述】:

我正在为一个数据结构项目实现一个各种各样的数据库,我很难将我的头脑围绕我需要做的逻辑。

我有一个抽象超类,名为Person,它有两个子类,名为StudentInstructor

最后,我有另一个名为UniversityPeople 的类,它在应用程序使用时创建对StudentInstructor 对象数组的引用。当UniversityPeople 的构造函数被调用时,它使用大小作为参数创建一个指定对象的数组。我似乎无法思考如何在创建时区分构造函数中的两个对象。我的第一个想法是 2 个构造函数:

Instructor[] instArray;
Student[] stuArray;

public UniversityPeople(int size)
{
    Student[] stuArray = new Student[size];
}
public UniversityPeople(int size)
{
    Instructor[] instArray = new Instructor[size];
}

但经过思考(并阅读一些内容)后,我知道我无法做到这一点。 我的下一个想法是在UniversityPeople 构造函数中使用一种对象验证方法,但我很难实现一个。

基本上,该类需要知道何时创建Student 对象数组以及何时创建具有整数大小作为参数的Instructor 对象数组。

如果有人能指出我正确的方向,我将不胜感激。我最近大部分时间都在用 C 进行编码,所以在这么长时间之后,回到 OOP 感觉有点奇怪。谢谢!

【问题讨论】:

  • 为什么不创建一个 Person 数组?
  • 您可以在UniversityPeople 上创建静态工厂方法,与构造函数不同,它们可以通过名称相互区分。但我不太了解你的要求。为什么你的类会有两个数组作为成员,但只初始化一个?
  • 因为它是抽象的,如果我没记错的话,子类将无法访问它们的方法,只能访问抽象超类的方法。不过我可能是错的?
  • @JohnBollinger 我想我的想法是,如果应用程序用户不想输入教师数据,而是只为学生输入数据,他们可以,但我的方法可能会很差。
  • 听起来像是泛型的用例。 UniversityGroup<T extends Person>,包含T的数组

标签: java object constructor


【解决方案1】:

首先,我会质疑这种方法 - 听起来这个单一的班级正在尝试做太多事情。但如果你真的非常想这样做,我会推荐调用私有构造函数的静态工厂方法:

public class UniversityPeople {
    private final Student[] students;
    private final Instructor[] instructors;

    private UniversityPeople(int studentCount, int instructorCount) {
        students = new Student[studentCount];
        instructors = new Instructor[instructorCount];
    }

    public static UniversityPeople forStudents(int size) {
        return new UniversityPeople(size, 0);
    }

    public static UniversityPeople forInstructors(int size) {
        return new UniversityPeople(0, size);
    }
}

您可以对每个大小进行检查,如果您真的愿意,则仅在它大于 0 时才分配。但正如我所说,如果可能,我会重新审视设计。

【讨论】:

  • 是的,我自己觉得这个实现很奇怪,但这是教练明确要求的,所以我必须服从。对我来说,两个不同的课程更有意义,但我离题了。无论如何,这绝对看起来可行,ty。
  • @FuegoJohnson:您可能希望将这些信息放在问题中。任何时候你问一些你知道听起来有点古怪的问题,在问题中承认它(并提供理由)以避免围绕这方面的事情进行讨论。如果这是你被要求的,那很好:)
  • 非常正确,我可能应该说点什么,但我对课堂的整体实施感到非常疲倦和沮丧,哈哈。无论如何,感谢您的快速回复,我选择了您的答案。 :)
【解决方案2】:

如果您只需要方向:寻找设计模式“工厂”。这应该对您有所帮助。

【讨论】:

  • 谢谢,我不知道这个实现,但它似乎很有用,谢谢你指出我正确的方向。
猜你喜欢
  • 2012-01-30
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2016-03-02
相关资源
最近更新 更多