Путаница в отношении реализации методов интерфейса - PullRequest
1 голос
/ 19 февраля 2010

HI У меня есть вопрос Если в интерфейсе есть четыре метода, и мне нравится реализовывать только два метода, как этого достичь?

Может ли какое-либо объяснение, что это возможно, или я должен пойти на реализацию всех методов.

Ответы [ 7 ]

4 голосов
/ 19 февраля 2010

Нельзя «частично» реализовать интерфейс, не объявив абстрактную реализацию класса, тем самым требуя, чтобы некоторый подкласс предоставил оставшуюся реализацию. Причина этого заключается в том, что интерфейс является контрактом, и при его реализации объявляется «Я предоставляю поведение, указанное интерфейсом». Какой-то другой код будет использовать ваш класс через объявленный интерфейс и будет ожидать, что методы будут там.

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

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

Короче, все зависит.

2 голосов
/ 11 октября 2012

Я думаю, что ответ @sateesh - тот, который ближе к решению вашей проблемы. Позвольте мне остановиться на этом подробнее. Прежде всего, обязательно, чтобы любой класс, реализующий интерфейс, предоставил определения для всех своих методов. Но в некоторых случаях пользователь может не найти применения для большинства методов интерфейса, кроме одного или двух. Рассмотрим следующий интерфейс, имеющий 6 абстрактных методов:

  public interface HugeInterface {
     void a();
     void b();
     void c();
     void d();
     void e();
     void f();
    }

Предположим, что ваш код находит использование только для метода 'c ()', и вы хотите предоставить подробности реализации только для метода 'c ()'. Вы можете создать новый класс HugeInterfaceAdapter в отдельном файле, который реализует все методы интерфейса HugeInterface, как показано ниже:

    public class HugeInterfaceAdapter implements HugeInterface {
     public void a() {}
     public void b() {}
     public void c() {}
     public void d() {}
     public void e() {}
     public void f() {}
    }

Обратите внимание, что вам не нужно предоставлять какой-либо фактический код реализации для любого из методов. Теперь начинается интересная часть. Да, ваш класс, в котором необходимость реализации огромного интерфейса возникла в первую очередь.

public class MyClass {
 HugeInterfaceAdapter mySmallInterface = new HugeInterfaceAdapter() {
  @Override
  public void c() {
   //Your class-specific interface implementation code here.
  }
 };
}

Теперь вы можете использовать справочную переменную mySmallInterface во всех местах, где ожидается HugeInterface. Это может показаться немного хакерским, но я могу сказать, что оно официально одобрено Java, и такие классы, как MouseAdapter , свидетельствуют об этом.

2 голосов
/ 19 февраля 2010

Если вы управляете дизайном интерфейса, просто разделите его на две части.Один интерфейс определяет два, которые реализуют только некоторые реализации, а один интерфейс определяет два других (или наследует первые два и добавляет больше, ваш выбор)

2 голосов
/ 19 февраля 2010

Вы можете создать реализующий класс abstract и реализовать два из 4 методов из интерфейса.

1 голос
/ 19 февраля 2010

Это невозможно.

Вы можете реализовать все четыре метода, но два, которые вам не нужны, должны выдать UnsupportedOperationException.

0 голосов
/ 19 февраля 2010

Как уже упоминалось в других ответах, у вас не может быть конкретного класса, реализующего только некоторые методы интерфейса, который он реализует. Если у вас нет контроля над интерфейсом, который расширяет ваш класс, вы можете подумать о наличии классов Adapter. Абстрактный класс Adapter может предоставлять фиктивную реализацию для методов интерфейса, а клиентские классы могут расширить класс адаптера. (Конечно, недостатком является то, что вы не можете продлевать более одного класса)

Это обычная практика для программирования GUI (с использованием Swing), где класс слушателя событий может не интересоваться реализацией всех методов, указанных интерфейсом EventListener. Например взгляните на интерфейс java.awt.event.MouseListener и соответствующий класс адаптера java.awt.event.MouseAdapter.

0 голосов
/ 19 февраля 2010

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

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