Чем цель интерфейса отличается от абстрактного класса с абстрактными методами? - PullRequest
3 голосов
/ 26 августа 2011

Объяснение / преамбула

В Java, если вы объявляете абстрактный класс с помощью абстрактных методов, например,

public abstract class MyAbstractClass {
  private String m_id;

  // default behavior
  public MyAbstractClass() { setId(null); }
  public String getId() { return m_id; }
  public void setId(String id) { m_id = id; }

  // overridenable method
  public void doSomething() { /* does nothing by default */ }

  // to-be-defined behavior
  public abstract void setSomething(Object o);
  public abstract Object getSomething();
}

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

public class MyClass extends MyAbstractClass {
  private Object m_o;

  // implements some actual complex behavior
  public void setSomething(Object o) { m_o = o; }
  public Object getSomething() { return m_o; }
}

возможно даже переопределение методов в суперклассе.

Так что кажется , что абстрактный класс с абстрактными методами ведет себя как если бы было interface,

public interface IMy {
  public void setSomething(Object o);
  public Object getSomething();
}

, потому что для его использования в конечном итоге необходимо указать фактический объект .

Вопросы

Это почти выглядит так, как будто это не имеет смысла в существующих и interface, и abstract class -with-abstract-Methods (ACWAM), так какони кажутся очень похожими.

  1. ACWAM кажется настолько невероятно похожим на interface!Я полагаю, что существенная разница заключается в их намерении .
  2. Я понимаю, что interface намеревается предоставить средство, с помощью которого пользователь библиотеки может «общаться» с библиотекой, не завися от реализации библиотеки.Правильно ли истолковано, что interface предназначен для того, чтобы «показывать что-то публике», тогда как ACWAM - это то, что предназначено для разработчиков библиотеки, чтобы «согласиться», но с «дополнительным бонусом» предоставленияповедение по умолчанию (переопределяемое)?
  3. Имеет ли смысл использовать interface одновременно с ACWAM?

Можете ли вы привести один или два простых примера (указавдля другого документа было бы хорошо), чтобы проиллюстрировать разницу в намерениях (или «правильном использовании») для этих двух, а именно interface и ACWAM?

Ответы [ 5 ]

5 голосов
/ 26 августа 2011

Большая разница между интерфейсом и абстрактным классом заключается в следующем:

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

Хорошим правилом работы является то, что API всегда должны ссылаться на интерфейсы.

Обратите внимание, что JDK завален ошибками, допущенными на ранних этапахгде (абстрактные) классы использовались там, где должны были использоваться интерфейсы. Стек является хорошим примером: стек должен быть интерфейсом, но это класс.Если вы хотите реализовать свой собственный стек, вы должны подкласс java.util.Stack, который очень предписывающий - вы можете не захотеть этого делать - возможно, вам нужна суперлегкая версия и т. Д.

Однако абстрактные классы имеют свое место: они могут предоставлять реализации интерфейсов по умолчанию.Хорошим примером является java.util.AbstractMap , класс, представляющий собой скелетную реализацию интерфейса java.util.Map .

1 голос
/ 26 августа 2011

Если это поможет, вы можете рассматривать интерфейс Java как контракт, а абстрактный класс Java - как шаблон.

1 голос
/ 26 августа 2011

Java не поддерживает множественное наследование. Следовательно, класс может реализовывать много интерфейсов, но он не может наследовать от нескольких базовых классов.

0 голосов
/ 26 августа 2011

Если вам нужно выбирать между интерфейсом и абстрактным классом ТОЛЬКО абстрактными методами, вам следует выбрать интерфейс, поскольку он дает вам больше возможностей на будущее: у вас может быть несколько интерфейсов, но только один абстрактный класс.

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

0 голосов
/ 26 августа 2011

Класс Abstarct с некоторыми / всеми абстрактными методами.но интерфейс с ВСЕМИ абстрактными методами.

В senarios, где все методы abstarct, тогда переходите к интерфейсу, подобному:

interface City
{
   public void pin();
   public void state();
}

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

Пример:

class Bangalore implements City
{
   public void pin()
   {
       System.out.println("127351731");
   }
   public void state()
   {
       System.out.println("Karnataka");
   }
}

class Lisbon implements City
{
   public void pin()
   {
       System.out.println("87456964");
   }
   public void state()
   {
       System.out.println("Lisbon");
   }
}

Но скажем, например: в подобных сценариях некоторые методы являются общими для классов, расширяющих этот класс, но некоторые они должны давать различную реализацию:

abstract class Animal{
  public abstract void eat();

  public void run()
  {
     System.out.println("I can Run");
  } 

}

И допустим, что Dog и Cat расширяют этот абстрактный класс.Они оба унаследуют один и тот же run () от класса Animal.

class Dog extends Animal
{
    public void eat()
    {
       System.out.println("I eat Meat");
    }
}

class cat extends Animal
{
    public void eat()
    {
       System.out.println("I eat only Fish");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...