2014-12-13 4 views
2

У меня 3 класса, человек, ученик и учитель. Студент и Учитель расширяют Личность. Как я могу получить доступ к переменным экземпляра из Person? Как если бы у Студента и Учителя был внутренний список имен, как я могу получить доступ к обоим массивам имен из родительского класса?Как получить доступ к дочерним переменным из родительского класса?

class Person 
{ 
    private String name; 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return this.name; 
    } 
    public void printAllNames() { //<-- How do you do this? 
     for(Student s : students) //can't access students array 
      System.out.println(s.getName()); 
     for(Teacher t : teachers) 
      System.out.println(t.getName()); 
    } 
} 

class Student extends Person 
{ 
    protected Student[] students; 
    Student(String name) 
    { 
     this.name = name; 
     students[students.length] = this; 
    } 
} 

class Teacher extends Person 
{ 
    protected Teacher[] teachers; 
    Teacher(String name) 
    { 
     this.name = name; 
     teacher[teachers.length] = this; 
    } 
} 

ответ

1

У вас неправильный дизайн. Ваш класс Student не должен содержать поле students, поскольку другие учащиеся не являются частью экземпляра Student (т. Е. Композиция не должна использоваться здесь). Вместо этого вы должны создавать списки студентов вне этих классов, если они требуются. Конечно же, для учителей.

У ученика может быть список друзей, но такие отношения лучше сохраняются вне самого класса. Список друзей - не часть студент. То, что нужно быть частью студента, зависит от того, что вы пытаетесь моделировать (адрес может быть частью студента, если это помогает определить ученика для целей администрирования).

Если вы хотите получить доступ к полям более высокого уровня, вы можете понизить до Student от Person, но опять же, что обычно рассматривается как техническое решение проблемы с дизайном.

+0

хм я вижу. Как насчет идеи статического массива студентов в каждом ученике? Хорошо, все еще плохой дизайн, как вы сказали, потому что каждый студент должен знать о других учениках. – penu

+0

У вас может быть константа 'Students.ALL', но я бы предпочел просто создать и зарегистрировать студентов в каком-то классе регистрации (возможно, в разделе« Школа »). Вы должны смоделировать школьный мир, поэтому рекомендации в * домене * в реальном мире обычно являются лучшим способом создания дизайна. Позже вы автоматически получите зуд, если дизайн не правильно моделирует домен :) –

+0

Это зависит от того, что вы пытаетесь сделать, если «Students.ALL» - хорошая идея; речь идет об уровнях абстракции. У вас может быть менее сложный дизайн для небольших проблем.Вы не должны заходить за борт и включать напольные плитки в дизайн: P –

0

Ваш код, имеющий проблемы в Array.length(), потому что нет какой-либо способ, как длины(). вы можете получить доступ к этому значению array.length.

вторым нет имени переменное в вашем Student класса и вы сделали имени, как частного поля Person класса изменить что общественных или защищаемого.

третий вы можете передать аргумент в методе, как

public void printAllNames(Student[] students, Teacher[] teachers) 

и проверить один раз.

1

Игнорирование проблем с дизайном и использованием массивов, как упоминалось другими, если вы хотите напечатать имена в зависимости от того, является ли это учеником и преподавателем, вы должны сделать абстрактные абзацы printAllNames и предоставить классы потомков для собственной печати реализация. Базовый класс не должен знать об особенностях свойств или методов в подклассах.

class Person 
{ 
    ... 

    public abstract void printAllNames(); 
} 


class Student extends Person 
{ 
    ... 

    public void printAllNames() { 
     for (Student s : students) 
      System.out.println(s.getName()); 
    } 
} 

class Teacher extends Person 
{ 
    ... 

    public void printAllNames() { 
     for (Teacher t : teachers) 
      System.out.println(t.getName()); 
    } 
} 
+0

«Игнорирование проблем с дизайном» Я действительно пытаюсь изучить ООП, поэтому, пожалуйста, не игнорируйте проблемы с дизайном. Но вопрос о видимости неизменен в зависимости от массива против карты, поэтому это не имеет значения для учебных целей. – penu

+0

Другие уже указали на наши недостатки в вашем дизайне, поэтому я решил, что я решаю другой аспект с вопросом о том, как вы столкнетесь с проблемой отсутствия доступа к полям в подклассе. Суть в дизайне заключается в том, что вам нужно переделать, где должны храниться учителя и ученики. Не имеет смысла хранить их в каждом экземпляре человека - это означает, что у ученика/учителя есть свой список. Вы могли бы сделать учащихся и учителей статичными, что будет иметь больше смысла, но лучший способ - сделать один класс школы, в котором есть список учителей и учеников. – ekcr1

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