2016-11-01 2 views
-4

Мои сомнения или аргументЗачем использовать абстрактный класс вместо расширения класса и реализации интерфейса?

IS-

Абстрактный класс может быть заменен путем расширения конкретного класса и реализации интерфейса.

Как или что?

В чем состоит абстрактный класс? Методы, которые реализуют поведение по умолчанию. Различные модификаторы доступа. Может расширить другой абстрактный класс. Может быть запрограммирован. и так далее ...

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

Я вижу абстрактный класс как сочетание класса бетона & Интерфейс.

Чтобы показать некоторые код-

public abstract class MobilePhone { 
    abstract public String getPhoneModel(); 
    public String getIMEI(){ 
     // Consider execute() is some function that returns us IMEI for now 
     return execute("*#06#"); 
    } 
} 


public class SamsungPhone extends MobilePhone { 
    public String getPhoneModel(){ 
     String imei = displayIMEI(); 
     return getSamsungModelFromDB(imei); 
    } 
} 

public class iPhone extends MobilePhone { 
    public String getPhoneModel(){ 
     String imei = displayIMEI(); 
     return getiphoneModelFromDB(imei); 
    } 
} 

То же самое может быть достигнуто, если мы делаем что-то вроде this-

public class MobilePhone { 
    public String getIMEI(){ 
     // Consider execute() is some function that returns us IMEI for now 
     return execute("*#06#"); 
    } 
} 

public interface Imobile { 
    String getPhoneModel(); 
} 

public class SamsungPhone extends MobilePhone implements Imobile { 
    public String getPhoneModel(){ 
     String imei = displayIMEI(); 
     return getSamsungModelFromDB(imei); 
    } 
} 

public class iPhone extends MobilePhone implements Imobile { 
    public String getPhoneModel(){ 
     String imei = displayIMEI(); 
     return getSamsungModelFromDB(imei); 
    } 
} 

Что это специальный вариант использования или необходимость в абстрактном классе?

References-

When to use an interface instead of an abstract class and vice versa?

When do I have to use interfaces instead of abstract classes?

How should I have explained the difference between an Interface and an Abstract class?

Oracle Docs - Abstract Class

и немного больше (но они не столь полезны)

PS: Я не имею в виду разницу между абстрактным классом и интерфейсом

+1

Итак, учитывая, что вы в порядке с базовыми классами, возникает вопрос: «зачем создавать абстрактные абстрактные классы?». Ну, иногда вы хотите поместить в него абстрактные методы. Иногда вы не хотите, чтобы ваш базовый класс создавался напрямую. Попытка добиться того же самого с сочетанием интерфейса и конкретного базового класса не снижает полезность абстрактного класса. – khelwood

+0

Жаль @RealSkeptic У меня нет отношения. Я видел подавленные голоса, хотя это был неподдельный вопрос, хотя я сказал, что это не тот старый вопрос об абстрактном классе vs Интерфейсы или что-то еще. Прости. Я никогда не хотел этого говорить. Но люди реагируют слишком быстро, не понимая, что именно происходит. – bozzmob

+1

@bozzmob Это не то, что это обман, хотя может быть, это не то, что на этом сайте ... – George

ответ

3

Абстрактный класс позволяет исправить поведение, как в:

public abstract class Foo { 

    protected abstract int getValue(); 

    public final void doTheFoo() { 
    int value = getValue(); 
    ... do something ... 
    } 

Используя такой подход, вы можете гарантии, что поведение doTheFoo() не может быть изменено подклассами Foo. Но все же вы можете расширить Foo и позволить этим подклассам иметь определенный удар на что doTheFoo() будет делать.

Это то, что вы не можете сделать с конкретными классами + интерфейсами.

Другой основной аспект: имейте в виду, что такие понятия также являются средним значением связи.Имея ключевое слово abstract, вы можете сообщить вашей «аудитории», которую вы делаете не хотите, чтобы этот экземпляр был создан. Если это имеет значение для вас прямо сейчас, это не настоящая точка; поскольку концепция была просто достаточно важной для отцов Java, чтобы сделать ее частью языка.

Смежные вопросы