Помощь с первым классом полиморфизма - PullRequest
2 голосов
/ 10 июля 2010

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

Poly1 :

public abstract class Poly1 {
    int comPoly;
}

SubPoly1 :

public class SubPoly1 extends Poly1 {
    String testPoly;
}

SubPoly2 :

public class SubPoly2 extends Poly1 {
    int x;
}

testPoly :

public class testPoly {
public static void main(String[] args) {
    Poly1[] testObj = new Poly1[2];
    testObj[0] = new SubPoly1();
    testObj[1] = new SubPoly2();
    testObj[1].x = 1;
    testObj[1].comPoly = 2;
    System.out.println("Test Output : " + testObj[1].x+ " and " + testObj[1].comPoly);
    testObj[0].testPoly = "Hello";
    testObj[0].comPoly = 8;
    System.out.println("Test Output : " + testObj[0].testPoly+ " and " + testObj[1].comPoly);
   }
}

Но программа не проходит этап компиляции, поскольку я получаю ошибку symbol not found всякий раз, когда пытаюсьдля доступа к переменным из SubPoly1 или SubPoly2 (например, testObj[1].x вернет ошибку).

Любая помощь приветствуется.

Ответы [ 4 ]

5 голосов
/ 10 июля 2010

Это потому, что вы объявили testObj как Poly1[], тогда как x определяется не в Poly1, а в SubPoly2. По ссылке Poly1 вы можете получить доступ только к comPoly.

Чтобы это исправить, вам нужно переместить x на Poly1 или использовать вместо него SubPoly2[] или привести Poly1 ссылку к SubPoly2 (что возможно только в том случае, если на самом деле а SubPoly2). Какое из них является лучшим решением, зависит от функциональных требований.

Смотри также:

3 голосов
/ 10 июля 2010

Вы объявили Poly1[] testObj = new Poly1[2];, что означает, что все, что вы помещаете в этот массив, независимо от фактического типа, может иметь доступ только к членам класса Poly1. Полиморфизм исходит из методов, а не переменных.

Например:

public class X
{
    public void foo()
    {
        System.out.println("hello from X");
    }
}

public class Y
    extends X
{
    public void foo()
    {
        System.out.println("hello from Y");
    }
}

public class Main
{
    public static void main(final String[] argv)
    {
        final X[] array;

        array = new X[2];
        array[0] = new X();
        array[1] = new Y();

        System.out.println(array[0].foo());
        System.out.println(array[1].foo());
    }
}

будет делать то, что вы ожидаете.

1 голос
/ 10 июля 2010

из родительской ссылки, вы можете ссылаться только на общие методы.вы используете родительскую ссылку для доступа к свойству, определенному в подклассе

1 голос
/ 10 июля 2010

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

Ключевое слово здесь будет с тем же именем .

Вы можете изменить свой пример и включить метод в базовый класс, например, public void sayHello(). Подклассы, так как они наследуются от базового класса, могут отвечать на sayHello, но если они сами не реализуют этот метод, вызов отправляется суперклассу 'sayHello. Полиморфизм происходит, если подклассы реализуют собственные методы sayHello.

Может быть, вам будет проще познакомиться с этой концепцией, если вы выберете еще говорящих примеров. Одной из ярких иллюстраций полиморфизма являются формы: у вас есть одна, возможная абстракция, базовая форма и разные подклассы, например линия, прямоугольник, круг и т. д. Теперь у каждой фигуры будет метод draw, но, конечно, эти фигуры будут использовать разные методы для рисования.

Некоторые отправные точки:

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