2015-11-08 4 views
0

В настоящее время я изучаю наследование в java. У меня есть суперкласс под названием «Студенты с подклассами» UndergradStudents & GraduateStudents. У обоих из них есть метод, называемый deansHonourList. В методе undergrad deansHonourList он проверяет, превышает ли GPA более 3,5 для списка деканов, а для подкласса выпускников gpa должен быть больше 3,75, я должен удалить методы в подклассах и создать один метод в суперклассе который определяет, соответствует ли студент для списка чести деканов. Вот мой код до сих пор.Упростить java-программу, используя наследование

import java.io.*; 

public class Activity6C { 
    public static void main(String[] args) { 
     Student[] students = new Student[4]; 

     students[0] = new UndergradStudent(8032, "Casper", 2.78, 2); 
     students[1] = new GraduateStudent(3044, "Sheena", 3.92, "Natural Language Processing"); 
     students[2] = new UndergradStudent(6170, "Yolanda", 4.26, 3); 
     students[3] = new GraduateStudent(1755, "Geordi", 3.58, "Human-Computer Interaction"); 

     printStudents(students); 
     printDeansList(students); 

     System.out.println("\nEnd of processing."); 
    } 

    public static void printStudents(Student[] students) { 
     System.out.println("\nList of all students:\n"); 
     for (int i = 0; i < students.length; i++) { 
      System.out.println(i + 1 + ": " + students[i]); 
     } 
    } 

    public static void printDeansList(Student[] students) { 
     System.out.println("\nDean's honour list:\n"); 
     for (int i = 0; i < students.length; i++) { 
      if (students[i].deansHonourList()) { 
       System.out.println(students[i]); 
      } 
     } 
    } 
} 

class Student { 
    private int number; 
    private String name; 
    private double gpa; 

    public Student(int number, String name, double gpa) { 
     this.number = number; 
     this.name = name; 
     this.gpa = gpa; 
    } 

    public double getGPA() { 
     return gpa; 
    } 

    public boolean deansHonourList() { 
     //Here is where i make my code to determine honour list students 
     return false; 
    } 

    public String toString() { 
     return number + " " + name + " (" + gpa + ")"; 
    } 
} 

class UndergradStudent extends Student { 
    private int year; 

    public UndergradStudent(int number, String name, double gpa, int year) { 
     super(number, name, gpa); 
     this.year = year; 
    } 

    public boolean deansHonourList() { 
     boolean result = false; 
     if (getGPA() >= 3.5) 
      result = true; 
     return result; 
    } 

    public String toString() { 
     return "Undergraduate: " + super.toString() + " year: " + year; 
    } 
} 

class GraduateStudent extends Student { 
    private String thesis; 

    public GraduateStudent(int number, String name, double gpa, String  thesis) { 
     super(number, name, gpa); 
     this.thesis = thesis; 
    } 

    public boolean deansHonourList() { 
     boolean result = false; 
     if (getGPA() >= 3.75) 
      result = true; 
     return result; 
    } 

    public String toString() { 
     return "Graduate: " + super.toString() + " thesis: " + thesis; 
    } 
} 

Примечание: Это упражнение, и это не стоит того, но я хотел бы дать подсказку в правильном направлении. Вот что задает этот вопрос.

Мне нужно заставить его работать без использования instanceof или getClass() и без добавления каких-либо инструкций if-else или переменных экземпляра. Не должно быть никакого метода deansHonourList() в GraduateStudent или UndergraduateStudent, и метод getGPA() может быть удален.

Подсказка, которую я получил, заключалась в том, чтобы добавить дополнительный класс к суперклассу и переопределить его в подклассах по мере необходимости; вызовите этот метод в вашем методе deansHonourList().


Я не могу придумать, как это сделать. Я имею в виду, что я могу добавить в новый метод экземпляра, который я бы сделал, а затем переопределить его в подклассах.

Благодарим вас за то, что вы прочитали мой вопрос или какие-либо подсказки, которые вы можете мне дать.

+0

Вы будете нуждаться другой (возможно абстрактную) метод, который определяет, если средний балл достаточно высок, на основе реализации 'Student' – MadProgrammer

+0

После удаления метода deansHonorList из подклассов, я сделал его в суперклассе. Затем он говорит, что я могу создать другой метод экземпляра в суперклассе и переопределить его в подклассах и использовать метод экземпляра в методе deansHonoutList, который также существует в суперклассе. Таким образом, абстрактным методом будет метод нового экземпляра, о котором вы говорите? –

+0

Подсказка: вы описали все шаги, которые необходимо предпринять в своем вопросе. Но вы не знаете, почему *. Итак, прежде чем вы подумаете о том, как это сделать, вы должны знать, что вы делаете. – Kenney

ответ

0

Вам нужен (возможно абстрактный) метод, который возвращает минимальный балл GPA приемлемый для рассмотрения в список почестей, может быть что-то вроде

abstract class Student { 

    private int number; 
    private String name; 
    private double gpa; 

    public Student(int number, String name, double gpa) { 
     this.number = number; 
     this.name = name; 
     this.gpa = gpa; 
    } 

    public double getGPA() { 
     return gpa; 
    } 

    public abstract double getMinimumHonourListGPA(); 

    public boolean deansHonourList() { 
     boolean result = false; 
     if (getGPA() >= getMinimumHonourListGPA()) { 
      result = true; 
     } 
     return result; 
    } 

    public String toString() { 
     return number + " " + name + " (" + gpa + ")"; 
    } 
} 

Тогда вы могли бы реализовать что-то делать, как ...

class UndergradStudent extends Student { 

    private int year; 

    public UndergradStudent(int number, String name, double gpa, int year) { 
     super(number, name, gpa); 
     this.year = year; 
    } 

    public String toString() { 
     return "Undergraduate: " + super.toString() + " year: " + year; 
    } 

    @Override 
    public double getMinimumHonourListGPA() { 
     return 3.5; 
    } 
} 

Теперь, если это не приемлемо, вам нужно будет пройти минимальный балл GPA через конструктора родительского класса, что-то вроде ...

class Student { 

    private int number; 
    private String name; 
    private double gpa; 
    private double minimumHonourListGPA; 

    public Student(int number, String name, double gpa, double minimumHonourListGPA) { 
     this.number = number; 
     this.name = name; 
     this.gpa = gpa; 
     this.minimumHonourListGPA; 
    } 

    public double getGPA() { 
     return gpa; 
    } 

    public boolean deansHonourList() { 
     boolean result = false; 
     if (getGPA() >= minimumHonourListGPA) { 
      result = true; 
     } 
     return result; 
    } 

    public String toString() { 
     return number + " " + name + " (" + gpa + ")"; 
    } 
} 

class UndergradStudent extends Student { 

    private int year; 

    public UndergradStudent(int number, String name, double gpa, int year) { 
     super(number, name, gpa, 3.5); 
     this.year = year; 
    } 

    public String toString() { 
     return "Undergraduate: " + super.toString() + " year: " + year; 
    } 
} 

, например

+0

Это, скорее всего, школьное задание, и ОП должен научиться делать это сам. – Kenney

+2

@ Кенни Да, это, вероятно, домашнее задание, и я ценю, что вы хотите, чтобы ОП изучил эти вещи сами, я согласен. Но ОП наложил определенную голову и попросил стороны, должны ли мы действительно игнорировать их или нам следует предоставить соответствующие указания, где мы можем. Я думал, что цель SO - попытаться помочь людям, которые нуждаются в этом. Следовательно, причина, по которой я предоставляю два возможных решения, попытаться предоставить некоторую форму обучения подходу, я уверен, что есть другие, чтобы достичь того же результата. Никто не является островом, а сообщество разработчиков больше, потому что люди поделились – MadProgrammer

+0

@ Kenney Я упомянул об этом в вопросе, если вы его не читали. Я попросил намек не на решение. Благодарю вас. –

0

Хорошо, что если у вас есть метод 'requiredGPA(), который вернулся ГПД, необходимых для получения в Список деканов Honor?

Вы бы затем переопределили этот метод в подклассах, чтобы вернуть их различные требования, а deansHonourList() суперкласса использовал бы значение, возвращаемое этим методом, чтобы решить, был ли ученик в списке?

Я мог бы привести пример кода, если необходимо ... сообщите мне, если я не был ясен в этом ответе?

Редактировать - похоже, что MadProgrammer поразил идею, которую я собирался здесь.

+0

Спасибо! MadProgrammer заставил меня заняться этим. Это программист, как вы, ребята, которые заставляют меня не заниматься информатикой. Хорошего дня! –

0

Это пример шаблона проектирования фасадов. Проверить here.

Этот шаблон предназначен для обеспечения простого интерфейса, чтобы скрыть сложность. Интерфейс используется для вызова одного и в течение времени выполнения JVM будет определять, какой метод вызывать.Этот метод определяется реализующим классом объекта, на который был вызван метод.

В вашем случае Студент будет работать как интерфейс. Как и другие, вы можете использовать абстрактный класс с абстрактным методом deansHonourList или вы можете использовать пустую реализацию.

Теперь предположим, что у нас есть пустые конструкторы во всех трех классах.

Student student1 = new Student(); 
Student student2 = new UnderGraduateStudent(); 
Student student3 = new GraduateStudent(); 

Поскольку задающее родительский класс может содержать экземпляр дочернего класса мы можем присвоить объекты UnderGraduateStudent и GraduateStudent к исходным переменным типа Student.

Все эти три класса имеют метод deansHonourList. Когда мы называем этот метод на всех трех объектов следующим образом

student1.deansHonourList(arguments...) 
student2.deansHonourList(arguments...) 
student3.deansHonourList(arguments...) 

JVM будет найти правильный класс, из которого он должен вызвать метод, проверяя тип экземпляров student1, student2, student3.

Будут называться только один из этих методов (в отличие от конструктора, в котором конструктор суперкласса вызывается в конструкторе подкласса).

Даже если deansHonourList вызывается ссылкой на родительский класс, метод из дочернего класса вызывается как ссылка, содержащая экземпляр дочернего класса. Это называется Метод переопределения.

Проверьте this вне.

Переопределение работает только в случае статических методов, в случае статических методов вызываются методы родительского класса. Поскольку статические члены являются частью класса, а не экземпляром класса, экземпляр не играет роли в разрешении метода. Это называется Метод Скрытие

Смежные вопросы