对于我的作业,我们的任务是“宣布一组四名”常规“大学员工,三名教师和七名学生。提示用户指定将输入哪种类型的数据(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();
(或Faculty
或CollegeEmployee
)。
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
类。
我是否遗漏了对此的任何批评性理解?
答案 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}}变量。动态分派确保方法调用始终解析为实际对象类型实现的方法版本,而不是变量类型。
请注意,这仅适用于Person
将someAction
定义为抽象或具体方法的情况。如果它是Person
首次引入,那么你需要做一个明确的演员。