Наследование в Core Java - PullRequest
7 голосов
/ 31 марта 2012

Для моей домашней работы нам было поручено "объявить массив из четырех" обычных "сотрудников колледжа, трех преподавателей и семи студентов. Предложите пользователю указать, какой тип данных будет вводиться (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

После прочтения Обучающих программ по наследованию и троллинга множества обсуждений наследования, я думаю, что я понял это правильно на бумаге, но предпочел бы некоторый ввод, прежде чем я получу глубокие отрывки в коде, который не Работа. :)

Я определяю

Person[x] = new Student();

(или Faculty или CollegeEmployee).

Класс Person имеет все поля ввода для Person, а подклассы имеют ТОЛЬКО дополнительные данные (например, major в случае Student).

Когда я создаю new Student(); поля ввода в ОБА, классы People и Student будут мне доступны, потому что Student расширяет People и дополнительные переменные, определенные в Student, добавляются к определение Person для этого экземпляра.

Когда приходит время извлекать данные из массива, Java видит их как массив Person, поэтому мне нужно добавить логику

if Person[x] instanceof Student (or `Faculty` or `CollegeEmployee`)

для выполнения соответствующих действий для типа Person. Я чувствую, что instanceof действует для переопределения (в данном случае для добавления) того, что Java знает о классе Person на стороне вывода.

Я упускаю какие-либо критические понимания этого?

Ответы [ 3 ]

3 голосов
/ 31 марта 2012

Прежде всего адрес должен быть скорее отдельным объектом.

Во-вторых, Student не может быть (не) прямым потомком Person, так как студент - это гражданский статус / служебная роль (это даже трудно определить), а человек - это синоним человека, который на С другой стороны, это вид. Другими словами, вы не можете сказать, что ученик является ( наследованием ) особого случая человека, но вы можете сказать, что у человека есть ( композиция *) 1012 *) гражданский статус студента.

Если вы посмотрите на свойства ваших классов, вы также заметите, что они не представляют одно и то же. Каждый объект должен фокусироваться на одной вещи ( принцип единой ответственности ), в то время как Person объект определяет имя и фамилию, возраст и т. Д. (Личные свойства), а CollegeEmployee определяет зарплату и имя отдел (связанные с работой свойства). Абсолютно не связанные свойства.

Короче говоря, человек - это действительно сложный объект, и это ужасный пример для человека, который пытается понять принципы ОО-дизайна.

3 голосов
/ 31 марта 2012

Существует не только наследование, но и полиморфизм - просто поместите код, необходимый для ввода и проверки данных объекта в методе объекта (скажем: inputMyData (), переопределяя базовый метод лично, возможно, вызывая метод суперкласса) - таким образом вы можете избежать instanceof и кастинг.

1 голос
/ 31 марта 2012

Вообще говоря, instanceof следует избегать.В данном случае проще всего сделать три массива: CollegeEmployee[], Faculty[] и Student[], а не объединять их в один Person[] и сортировать их позже.

Исходный ответ ниже:

Если я правильно понимаю, что вы пытаетесь сделать правильно, instanceof не требуется.

Если вы пишетечто-то вроде

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

, где someAction - это метод, определенный для Person и переопределенный Student, тогда Java вызовет версию Student, даже если метод вызывается на Person переменная.Динамическая диспетчеризация гарантирует, что вызовы метода всегда разрешают версию метода, реализованную фактическим типом объекта, а не типом переменной.

Обратите внимание, что это работает, только если someAction определен как абстрактный или конкретный методPerson.Если он впервые введен Student, то вам нужно выполнить явное приведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...