2016-10-05 4 views
0

Из-за задания домашней работы, которое должно проверять наше понимание наследования, у меня есть много разных подклассов, все из которых имеют одинаковые переменные экземпляра. В каждом из этих подклассов у меня есть метод printInfo(), который печатает все переменные экземпляра. printInfo() точно такой же в каждом классе, в котором он существует, но я уверен, что я не могу перенести его в какой-либо из родительских классов, потому что некоторые из переменных экземпляра существуют только в этом дочернем классе (также известный как класс, который также содержит printInfo()). Из того, что я прочитал, я могу создать ArrayList, который содержит все объекты с помощью родительского класса, как это:Можно ли вызвать тот же метод для разных типов объектов одного и того же родительского класса с ArrayList в Java?

ArrayList<Parent> myArrayList = new ArrayList<Parent>; 
myArrayList.add(new Child1()); 
myArrayList.add(new Child2()); 

Моя проблема заключается в том, что я хочу, чтобы иметь возможность вызывать printInfo() по каждому объекту в этом ArrayList. Я пытался использовать цикл как это:

for(int i = 0; i < myArrayList.size(); ++i) { 
    myArrayList.get(i).printInfo(); 
} 

но не распознает мой printInfo() метода, поскольку он существует только в подклассах, а не родительский класс, который использует ArrayList. Я предполагаю, что это потому, что ArrayList содержит объекты класса Parent, поэтому он не будет вызывать никаких функций-членов дочернего класса. Есть ли способ, которым я могу вызвать метод printInfo() с использованием ArrayList (или аналогичной структуры данных)?

ПРИМЕЧАНИЕ: Я знаю, что эта программа плохо разработана с учетом того, что существует несколько подклассов с одинаковыми методами, но мне сказали, что это именно то, что ожидается от назначения. Мне не нужны советы о том, как реструктурировать классы, мне интересно только найти способ эффективного вызова одного и того же метода на нескольких объектах разных классов.

+0

Я также сомневаюсь, что назначение плохо спроектировано. Вероятно, это должно научить вас наследованию. –

+0

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

+0

Непонятно, что вы дублировали. Если вы действительно скопировали код самостоятельно, то обязательно, вы можете объединить «общие» переменные экземпляра в общий класс –

ответ

1

В каждом из этих подклассов, у меня есть метод ПРИНТИНФО(), который печатает все переменные экземпляра , Принтинфо() точно так же в каждом классе он существует в

Кажется хорошо

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

Вы можете перемещать метод.Вам нужно переопределить это в каждом из детей. Не имеет значения, существуют ли некоторые переменные в родительском объекте, просто напечатайте переменные, которые у вас есть. Содержание методов должно быть разным. Это назначение - понимать наследование и метод переопределения.

Если вам нужно напечатать переменные родителей, вы можете вызвать super.printInfo() в классах Child.

Например, если родительский и дочерний объекты имеют некоторую переменную экземпляра с тем же именем, то дочерний класс «затеняет» переменную родителя. Не нужно ничего копировать.

но он не признает мой метод printInfo().

Как только вы реализуете метод класса Parent, он будет. Когда у вас есть объект, который расширяет родительский элемент, он вызовет переопределенный метод.

, потому что она существует только в подклассах, а не родительский класс, который использует ArrayList

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

Parent p = myArrayList.get(i); 
if (p instanceof Child1) { 
    ((Child1) p).printInfo(); 
} 
+0

............... точно 1+ –

+0

Я отредактировал для уточнения. – kanderson8

+1

@ comp1020comp: а крикет и мои ответы одинаковы. Дайте родительскому классу метод 'printInfo()' и переопределите его в дочерних классах, которые должны быть переопределены. Период. Конец истории. Полная остановка. –

2

Есть ли способ, которым я могу вызвать метод printInfo(), используя ArrayList (или аналогичную структуру данных)?

Только если родительский класс или интерфейс имеет метод printInfo(). Обратите внимание, что даже если родительский класс имеет метод printInfo(), каждый дочерний класс может переопределить его и напечатать собственные переменные в методе. Часто такой метод сначала вызовет метод суперпользователя родителя, прежде чем вызывать его собственную переменную.

Например:

import java.util.ArrayList; 
import java.util.List; 

public class ParentChild { 
    public static void main(String[] args) { 
     List<Parent> parentList = new ArrayList<>(); 
     parentList.add(new Parent()); 
     parentList.add(new Child1()); 

     for (Parent obj : parentList) { 
      obj.printInfo(); 
      System.out.println(); 
     } 
    } 
} 

class Parent { 
    private int a = 0; 

    public int getA() { 
     return a; 
    } 

    public void setA(int a) { 
     this.a = a; 
    } 

    public void printInfo() { 
     System.out.print("a: " + a); 
    } 
} 

class Child1 extends Parent { 
    private int b = 2; 

    public int getB() { 
     return b; 
    } 

    public void setB(int b) { 
     this.b = b; 
    } 

    @Override 
    public void printInfo() { 
     super.printInfo(); 
     System.out.println("; b: " + b); 
    } 
} 
Смежные вопросы