2016-03-10 2 views
0

У меня есть класс, называемый Interpreter. Он унаследован несколькими классами, включая класс LoadStep.Java Список вопросов наследования объектов

Я создал список объектов:

public static List<Interpreter> fileActions = new ArrayList<Interpreter>(); 

Объекты были добавлены таким образом:

if (actionName.equals("LOAD")) { 
    LoadStep loadAction = new LoadStep(); 
    fileActions.add(loadAction); 
} 

При попытке получить доступ к своим объектам и назвать свои методы, я не могу получить доступ к методы дочернего класса. Я ожидал, потому что, когда я пытаюсь getClass() видеть класс объекта, я получаю имя дочернего класса.

for (int i = lineNumber; i < Test.fileActions.size(); i++) { 

     System.out.println(Test.fileActions.get(i).getClass()); 
     if (Test.fileActions.get(i) instanceof LoadStep) { 
      LoadStep newAction = Test.fileActions.get(i); 
      myMemoryAddress = Test.fileActions.get(i).getMemoryAddress(); //This line gives me Cannot Find Symbol, as getMemoryAddress is LoadStep's method, and not Interpreter 
     } 
    } 

Оператор печати дает мне:

class test.LoadStep 
+0

Меня интересует ввод наилучшего ответа. – user25976

+1

Как насчет того, у кого есть 3 upvotes? Помните, что вы все равно можете выбрать все ответы, которые помогли вам, хотя вы можете принять только один! –

ответ

5

Вы должны были бы типаж экземпляры LoadStep, как

Interpreter step = ...; 
if (step instanceof LoadStep) { 
    LoadStep sub = (LoadStep) step; 
    sub.invokeSubclassMethod(...) 
} 
3

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

Child child = new Child(); 
Parent parent = child; 

Чтобы оживить объект Child, все, что вам нужно сделать, это присвоить объект ссылочной переменной типа Parent. Родительская ссылочная переменная не может получить доступ к элементам, доступным только в Child.

Поскольку родительский объект ссылается на объект типа Child, вы можете вернуть его обратно в Child. Он называется downcasting, потому что вы бросаете объект в класс вниз по иерархии наследования. Downcasting требует, чтобы вы записывали дочерний тип в скобки. Например:

Child child2 = (Child) parent; 
1

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

Пример:

public class MyClass { 
    public void myMethod(){} 
    public void myMethod2(){} 
} 
public class MyClass2 extends MyClass{ 
    public void myMethod3(){} 
} 
public class MyTestClass { 

    public void doSomeThing(){ 

     MyClass myClass= MyClass2(); 
     myClass.myMethod(); // valid 
     myClass.myMethod2(); // valid 
     myClass.myMethod3(); // invalid 
    } 
} 

Вы не можете вызвать метод myMethod3() на переменную, как она была напечатана его родителя/предка. Это проблема, с которой вы сталкиваетесь. Если вы хотите получить доступ к методу вы должны типаж его фактического класса, как это:

((MyClass2)myClass).myMethod3(); // valid 

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

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