Подтвердить что ты не робот

Почему мы должны объявлять методы интерфейса общедоступными?

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

У нас могут быть случаи, когда мы хотим использовать либо default (например, в случае доступа в одном пакете), либо protected.

Может кто-нибудь объяснить причину этого ограничения?

4b9b3361

Ответ 1

Интерфейсы предназначены для определения публичного API типа - и только это, а не для его реализации. Таким образом, любой метод (или статический член), который вы определяете в интерфейсе, по определению public.

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

Ответ 2

Возможно, это даст некоторые ответы.

Насколько я знаю, вы используете interfaces, чтобы люди из вашего кода могли взаимодействовать с вашим кодом. Для этого вам необходимо определить свои методы public.

Если вы хотите заставить кого-то переопределить заданный набор частных методов, вы можете захотеть объявить абстрактный класс серией абстрактных защищенных методов.

Ответ 3

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

Ответ 4

EDIT: Этот ответ предназначен для реализаций интерфейса С#. В этом случае Java сценарий похож на то, что синтаксический анализатор хочет, чтобы ключевое слово public упоминалось в интерфейсе, что неявно сделано в С#

В С# методы интерфейса неявно public, поскольку интерфейс - это контракт, предназначенный для использования другими классами. Кроме того, вы должны объявить эти методы общедоступными, а не статическими, если реализовать интерфейс.

interface IStorable
{
     void Read( );
     void Write(object obj);
}

Обратите внимание, что объявления метода IStorable для Read( ) и Write( ) не включают модификаторы доступа (public, protected..). Фактически, предоставление модификатора доступа генерирует ошибку компиляции.

class Document : IStorable
{
     public void Read( )
     {
         //
     }
     public void Write(object obj)
     {
         //
     }
}

Просто подумайте о интерфейсах как Контракты, которые будут реализованы как public

Ответ 5

  • Если мы отметим метод интерфейса как закрытый, класс реализации не будет см. метод и не могу его переопределить.

  • Если мы помечаем метод интерфейса как защищенный класс реализации не увидите этот метод, если он не находится в том же пакете, что и интерфейс.

  • Если мы отметим метод интерфейса без модификатора доступа, реализация класса не увидит метод, если он не находится в том же
    пакет как интерфейс