2016-05-23 2 views
0

Shape.javaАбстрактный класс или публичный метод с использованием интерфейса

public interface Shape { 
    String draw(); 

    void calcSomething(); 
} 

Square.java

public class Square implements Shape { 
    @Override 
    public String draw() { 
     return "SQUARE"; 
    } 

    @Override 
    public void calcSomething() { 

    } 
} 

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

Я хочу сделать draw() общественный метод, но calcSomething()частный или защищенный.

Я прошел через Interfaces in Java: cannot make implemented methods protected or private . И там нет прямого способа сделать это

Таким образом, вместо того, чтобы использовать интерфейс я планирую использовать абстрактный класс

Shape.java с использованием абстрактного класса

public abstract class Shape { 
    abstract public String draw(); 

    abstract protected void calcSomething(); 
} 

Square.java, который реализует Shapeаннотация класс

public class Square extends Shape { 
    @Override 
    public String draw() { 
     return "SQUARE"; 
    } 

    @Override 
    protected void calcSomething() { 

    } 
} 

Какой из них выбрать. Должен ли я использовать интерфейс и сделать calcSomething()общественности или я должен использовать абстрактный класс и сделать calcSomething()защищены

+0

мнение: i'd будет использовать второй, чтобы иметь возможность сохранять координаты фигуры в «List» или что-то в этом роде.Но абстрактный класс имел бы смысл только в том случае, если вы хотите хранить информацию для этого 'Shape', в то же время позволяя пространство для абстрактных реализаций для наследующих классов. Как sidenode, если бы я читал метод 'draw', я бы предпочел, чтобы он что-то нарисовал, вместо того, чтобы просто возвращать' String'. Я мог бы подумать о том, чтобы переименовать этот метод, чтобы представить, что он действительно делает. – SomeJavaGuy

+0

Почему 'calcSomething' является приватным, если он находится в интерфейсе? –

+0

У меня есть другой класс, который реализует Shape. Все они используют одно и то же имя метода для вычисления чего-то. Я просто хотел добавить этот метод в интерфейс. @ReutSharabani. Возможно, я ошибаюсь так думать. Пожалуйста, исправьте меня, если я ошибаюсь –

ответ

2

Цитирование The Java™ Tutorials - What Is an Interface?:

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

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

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

Если вы хотите, чтобы calcSomething() можно было вызывать из другого кода в Shape, тогда ... К сожалению, в Shape нет другого кода. Это интерфейс.
Хорошо, если вы хотите, чтобы calcSomething() мог быть вызван из другого кода в Square, вам нужно, чтобы он был абстрактным (или заглушкой). Это, например, как работает template method pattern.

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