Java - объявление переменных в интерфейсе, но не их назначение

1

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

public abstract class Shapes{
public static final int edges; 
    public Shapes(int edges) {
        this.edges = edges;
    }
}

public interface Shapeable{
    int edges;
}

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

Теги:
inheritance
interface

3 ответа

1
Лучший ответ

Любые поля на интерфейсе автоматически public static final. Вы не можете "реализовать" поле, эта концепция не существует. Интерфейсы в Java - это определение PUBLIC API метода и, следовательно, содержат только публичные сигнатуры методов.

Я предлагаю вам изучить использование перечислений или определить геттеры в интерфейсе, как предлагает rgettman, постоянный интерфейс antipattern имеет слишком много недостатков. Если вы хотите использовать его правильно, просто посмотрите на эту ссылку. Короче говоря, то, что на самом деле делает постоянный интерфейс antipattern, просто позволяет удобно называть константы в коде. Использование константного интерфейса antipattern - то же самое, что и использование класса только с публичными статическими конечными членами, в противном случае (и на самом деле у нас есть статический антипаттерн импорта для этой конкретной цели, но прислушайтесь к советам оракула и используйте экономно)

Редактировать:

Причина, по которой вы получаете ошибку "не инициализирована", состоит в том, что поле интерфейса, как я уже говорил, автоматически public static final независимо от того, какие модификаторы вы размещаете на нем. Поскольку вы не инициализировали static final поле, компилятор жалуется на вас.

3

Вы не можете заставить класс иметь переменную, но с интерфейсом вы можете заставить его иметь метод. Измените переменную edges в вашем интерфейсе на метод.

public interface Shapeable {
    int getNumEdges();
}

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

  • 0
    @TwoShorts_ рассмотреть вопрос о прочтении моего ответа. этот ответ хорош, но я заметил, что у вас есть неправильное представление о том, как объявления полей работают с интерфейсом, и этот ответ на самом деле не затрагивает этого.
0

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

public abstract class Shape{
    int edges = -1;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню