Почему я получаю сообщение об ошибке «не могу найти символ» при компиляции этого метода интерфейса? - PullRequest
1 голос
/ 29 сентября 2011

Я использую интерфейс Место:

public interface Place
{
    int distance(Place other);
}

Но когда я пытаюсь реализовать интерфейс и скомпилировать следующий код, возвращается ошибка «не удается найти символ - переменная xcor».

public class Point implements Place
{
    private double xcor, ycor;

    public Point (double myX, double myY)
    {
        xcor = myX;
        ycor = myY;
    }

    public int distance(Place other)
    {
        double a = Math.sqrt( (other.xcor - xcor) * (other.xcor - xcor) + (other.ycor - ycor) * (other.ycor -ycor) ) + 0.5;
        return (int)a;
    }

}

Есть идеи, что я могу делать не так? Это как-то связано с областью действия полей?

Ответы [ 5 ]

1 голос
/ 29 сентября 2011

Это потому, что интерфейс Place не предоставляет символ с именем 'xcor'. Это только выставляет метод «расстояние». поэтому, когда у вас есть переменная типа Place, компилятор не знает, какой это базовый тип. Вы должны либо сделать так, чтобы Place выставил получатель для xcor / ycor и т. Д., Либо понизьте значение экземпляра «Place» до «Point». Даункастинг обычно не одобряется, когда у вас есть несколько реализаций Place, но это обычная проблема с интерфейсом, который перекрывает реализации, которые имеют различные базовые свойства. Как и в случае с «Shape», который имеет «area ()» с реализациями Rectangle и Circle, которые используют разные методы вычисления области.

1 голос
/ 29 сентября 2011

Интерфейс Place не имеет члена xcor.Добавьте метод double getXcor() в свой интерфейс и реализуйте его в своем классе.То же относится и к ycor.Затем вы можете использовать эти геттеры в своей реализации метода distance.

public interface Place
{
    int distance(Place other);
    double getXcor();
    double getYcor();
}
0 голосов
/ 29 сентября 2011

Несколько более ранних плакатов упоминают проблему, которая заключается в том, что distance дается Место, в котором нет xcor.Я собираюсь пойти немного дальше и предположить, что это место для дженериков.Вероятно, нет смысла определять функцию расстояния между произвольными местами.(Если это так, тогда xcor и ycor можно превратить в абстрактный класс между Place и Point.)

public interface Place<T> {
   int distance (Place<T> other);
}

class Point implements Place<Point> etc.
0 голосов
/ 29 сентября 2011

Параметром для метода distance является Place, а не Point.Только класс Point имеет поле с именем xcor.

0 голосов
/ 29 сентября 2011

A Place не имеет членов xcor и ycor, а Point имеет.

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