2013-07-22 4 views
0

Было опрошено 100 раз, но у всех есть разные ответы. поэтому я осмеливаюсь поставить этот вопрос еще раз. Почему мы не можем переместить весь абстрактный метод в интерфейс?Abstract method vs Interface method

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

Заранее спасибо.

ответ

2

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

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

abstract class MyClass { 
    someConreteMethod() { ... } 
    abstract someAbstractMethod(); 
} 

Может быть, вы хотите только реализации MyClass расширить абстрактный MyClass

В общем, я не часто используют общественные абстрактные методы, но имеющие непубличные те гораздо чаще встречается.

+0

Спасибо за пример шаблона, имеет смысл есть. Но во втором примере я могу просто иметь базовый класс для общей логики someconcretemethod() и написать интерфейс для someabstractmethod, если он является общедоступным. Итак, публичный абстрактный метод должен перейти к интерфейсу? Также кажется, что базовая классификация должна быть абстрактной большую часть времени. – snail

+0

@jeff хорошая точка – Brad

+0

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

1

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

Тривиальным примером может быть класс Person

abstract class Person{ 

public void pumpBlood(){ 
//do blood pumping stuff 
} 

public void talk(); 
public void getDressed(Clothes someClothes); 
} 

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

+0

Спасибо Брэд, мой вопрос больше об абстрактном «методе». Он не реализован в абстрактном классе, поэтому почему бы не переместить его в интерфейс. Также говорится о программе для интерфейса. не кажется правильным переместить весь абстрактный «метод» в интерфейс и сохранить общую логику в базовом классе или абстрактном классе. – snail

+0

вас неправильно понял. – Brad

1

Это пример шаблона метода шаблонов. Шаблон сделано с абстрактным классом, с каким-то методом финалов (логика, что вы не хотите быть изменено), и абстрактными методами (чтобы де перекрываться реализациями)

public abstract class HtmlTemplate { 

    /** 
    * Get html code. 
    * Its final, so nobody can override. 
    * @return Html code. 
    */ 
    public final String getHtml() { 
     String html = "<html>" 
       + "<head>" 
       + getHead() // abstract method 
       + "</head>" 
       + "<body>" 
       + getBody() // abstract method 
       + "</body>" 
       + "</html>"; 
     return html; 

    } 

    /** 
    * Get head implementation. 
    * @return head code 
    */ 
    protected abstract String getHead(); 

    /** 
    * Get body implementation. 
    * @return body code 
    */ 
    protected abstract String getBody() ; 
} 

public class MyHtmlPageImpl extends HtmlTemplate { 

    @Override 
    protected String getHead() { 
     return "<title>My page</title>"; 
    } 

    @Override 
    protected String getBody() { 
     return "Hello world"; 
    } 
} 
+0

спасибо, другой взгляд со стороны HTML. – snail