Полиморфный класс / Полиморфизм / Внутренний класс - Получение сообщения об ошибке - PullRequest
2 голосов
/ 13 декабря 2011
public class PolyMorphic {

public static void main(String[] args) {

    PolyMorphic.printNumber(new IntNumber(1));
    PolyMorphic.printNumber(new DoubleNumber(4.54));

}

public static void printNumber(MyNumber N) {
    N.print(N);
    System.out.println();
}

public abstract class MyNumber{
    abstract void print(MyNumber N);
}

public class IntNumber extends MyNumber{
    int x;

    IntNumber(){
        x = 3;
    }

    IntNumber(int x){
        this.x = x;
    }


    void print(MyNumber N) {
        double temp = (double)x;
        System.out.printf("%.2f",temp);

    }
}


public class DoubleNumber extends MyNumber{
    double x;

    DoubleNumber(){
        x = 3.23;
    }

    DoubleNumber(double x){
        this.x = x;
    }


    void print(MyNumber N) {
        double temp = x;
        System.out.printf("%.2f",temp);

    }
}

 }

Поэтому я пытаюсь создать метод в классе PolyMorphic с именем printNumber, который равен polymorphic и может выводить (на консоль) либо intNumber с двумя десятичными разрядами справа, либо DoubleNumber с три знака после запятой справа. Такие как PolyMorphic.printNumber(new IntNumber(1));

Моя проблема заключается в следующем:

На линии:

PolyMorphic.printNumber(new IntNUmber(1));
PolyMorphic.printNumber(new DoubleNumber(4.54));

Это сообщение об ошибке:

"Ни один включающий экземпляр типа PolyMorphic не доступен. Должен квалифицировать распределение с включающим экземпляром типа PolyMorphic (например, x.new A (), где x - это экземпляр PolyMorphic). "

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Не вкладывайте свой класс MyNumber и его дочерние объекты в Polymorphic.

Подобные вложенные классы подходят только тогда, когда вложенный класс (MyNumber, IntNumber, DoubleNumber) является частьюреализация окружающего класса (Polymorphic).В вашем случае единственное отношение между этими двумя классами состоит в том, что Polymorphic вызывает методы для классов Number.

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

Правка - почему кто-то отрицает ответ, который является одновременно правильным и добавляет дополнительную информацию к ответу, предоставленному другими ответами?

1 голос
/ 13 декабря 2011

Для ваших внутренних классов требуется экземпляр вашего PolymorphicClass из-за того, как вы их объявили. Однако в вашем случае это вам не нужно, поэтому вы можете пометить свои внутренние классы как static:

public static class IntNumber

и

public static class DoubleNumber

Это особенность дизайна Java.

Еще одним решением было бы работать с экземпляром PolymorphicClass:

Polymorphic p = new Polymorphic();
p.printNumber(new IntNumber(1));
p.printNumber(new DoubleNumber(4.54));

EDIT:

Вам также необходимо:

public static abstract class MyNumber
...