核心Java中的继承

时间:2012-03-31 13:23:19

标签: java oop inheritance

对于我的作业,我们的任务是“宣布一组四名”常规“大学员工,三名教师和七名学生。提示用户指定将输入哪种类型的数据(C,F,S)或退出选项(Q)。当用户继续时,接受相应人员的数据输入。如果用户为每个人类型输入的数量超过指定数量,则显示错误消息。当用户退出时,显示报告屏幕列出适当标题下的每组人员。如果用户在会话期间未输入一种或多种类型的人员数据,则在相应标题下显示相应的消息。“

    Class           | Extends         | Variables
--------------------------------------------------------
    Person          | None            | firstName, lastName, streetAddress, zipCode, phone
    CollegeEmployee | Person          | ssn, salary,deptName
    Faculty         | CollegeEmployee | tenure(boolean)
    Student         | person          | GPA,major

在阅读继承的Tutorials并拖延一堆继承讨论之后,我想我已经把它写在纸面上了,但是在我深深陷入无效的代码之前,我会更喜欢一些输入。 :)

我正在定义

Person[x] = new Student();

(或FacultyCollegeEmployee)。

Person类包含Person的所有输入字段,子类只有附加数据(例如major的{​​{1}})。

当我同时创建Student输入字段时,我可以使用new Student();People类,因为Student扩展了Student和其他People中定义的变量将附加到该实例的Student定义中。

当从数组中提取数据时,Java将其视为Person的数组,因此我需要添加逻辑

Person

if Person[x] instanceof Student (or `Faculty` or `CollegeEmployee`) 类型执行适当的操作。我的感觉是Person正在覆盖(在这种情况下是附加)Java知道输出端的instanceof类。

我是否遗漏了对此的任何批评性理解?

3 个答案:

答案 0 :(得分:3)

首先,地址应该是一个单独的对象。

其次,Student不能是Person的直接后裔,因为学生是公民身份/工作角色(甚至很难定义),而人是人类的同义词存在,另一方面是一个物种。换句话说,你不能说学生inheritance)特殊情况的人,但你可以说那个人composition )学生的公民身份。

如果您查看课程的属性,您还会注意到它们不代表同一个东西。每个对象应该关注一件事(single responsibility principle),而Person对象定义名字和姓氏,年龄等(人员相关属性)和CollegeEmployee定义工资和名称部门(与工作有关的财产)。完全不相关的属性。

简而言之,一个人是一个非常复杂的对象,对于试图理解OO设计原则的人来说,这是一个可怕的例子。

答案 1 :(得分:3)

不仅有继承,而且还有多态 - 只需要在对象的方法中输入和验证对象数据所需的代码(比如:inputMyData()覆盖基本方法,可能调用超类的方法) - 这样你就可以避免实例和铸造。

答案 2 :(得分:1)

一般来说,应避免使用instanceof。在这种情况下,简单的做法似乎是制作三个数组:CollegeEmployee[]Faculty[]Student[],而不是将它们全部合并为一个Person[]并在以后整理出来。

以下原始答案:

如果我了解您要正确执行的操作,则无需instanceof

如果你写的话

Person bob = new Student();
bob.someAction();

其中someAction是为Person定义并被Student覆盖的方法,然后Java将调用Student版本,即使该方法是在{{{}}上调用的1}}变量。动态分派确保方法调用始终解析为实际对象类型实现的方法版本,而不是变量类型。

请注意,这仅适用于PersonsomeAction定义为抽象或具体方法的情况。如果它是Person首次引入,那么你需要做一个明确的演员。