Объяснение / преамбула
В 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), так какони кажутся очень похожими.
- ACWAM кажется настолько невероятно похожим на
interface
!Я полагаю, что существенная разница заключается в их намерении . - Я понимаю, что
interface
намеревается предоставить средство, с помощью которого пользователь библиотеки может «общаться» с библиотекой, не завися от реализации библиотеки.Правильно ли истолковано, что interface
предназначен для того, чтобы «показывать что-то публике», тогда как ACWAM - это то, что предназначено для разработчиков библиотеки, чтобы «согласиться», но с «дополнительным бонусом» предоставленияповедение по умолчанию (переопределяемое)? - Имеет ли смысл использовать
interface
одновременно с ACWAM?
Можете ли вы привести один или два простых примера (указавдля другого документа было бы хорошо), чтобы проиллюстрировать разницу в намерениях (или «правильном использовании») для этих двух, а именно interface
и ACWAM?