Преимущества использования абстрактных классов по сравнению с обычным классом - PullRequest
19 голосов
/ 06 июля 2010

Я решил начать делать небольшие проекты по написанию кода самостоятельно, которые фокусируются на качестве кода, а не на количестве кода, и имеют вопрос об использовании абстрактных классов.

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

Ответы [ 8 ]

16 голосов
/ 06 июля 2010

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

Интерфейс: используйте это, когда вы хотите применить определенные функции, которые должны быть определены.Например, у IBird есть контракт на ScreamLikeABird и Fly (функции интерфейса).Но вы можете получить более конкретную информацию и получить IOstrich, у которого есть контракт Run.У вас также может быть IHawk, у которого есть контракт Attack ... и т. Д.

Аннотация: используйте его, если вы хотите применить базовые функции и иметь базовые свойства.Например, Avian может быть базовым классом для птиц, у которого может быть функция с именем LayEgg, а также свойства, называемые Age, Species, NumberOfChicks ... и т. д.Эти вещи не должны изменить поведение птицы, поскольку все птицы откладывают яйца ... и т. Д.Но не все птицы звучат одинаково, когда они кричат ​​или летят одинаково (некоторые даже не летают) .... и т. Д ...., следовательно, они должны быть реализованы через интерфейс (ы).

12 голосов
/ 06 июля 2010

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

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

7 голосов
/ 10 ноября 2015

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

Абстрактные классы и интерфейсы

Как вы знаете, это две основные концепции наследования.

По сути, интерфейс используется только для того, чтобы объявить, что вы готовы наследовать базовый сервис, и все.Не содержит реализации и не имеет функциональности.В этом смысле интерфейс является абстрактным.Вот почему это скорее ограничение дизайна, чем ограничение реализации.Подумайте о разъеме для наушников на динамике.В каждом наушнике должен быть реализован интерфейс разъема (с методами start, stop, listen, turnDown, turnUp).Каждый наушник должен переопределять этот интерфейс, чтобы наследовать функциональные возможности, которые предоставляет динамик, и реализовывать его соответствующим образом.

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

Конечно, не говоря уже о том, что вы можете расширить только один класс в Java, где вы можете реализовать несколько интерфейсов.

Абстрактные классы против обычных классов

Так почему бы тогда не использовать обычные классы.В чем преимущество использования абстрактного класса?Это довольно просто.Если вы используете абстрактные классы, вы заставляете основную функциональность быть реализованной братьями и сестрами.Как разработчик, вам не нужно помнить, что вы должны реализовать основные функции.Здесь абстрактные классы накладывают ограничения на дизайн над обычными классами.Кроме того, делая абстрагирование класса, вы избегаете случайного создания этого (неполного) класса.

1 голос
/ 19 июня 2017

, по моему мнению, абстрактные классы более широко используются в реальных проектах, чем в книгах.иногда менеджеры проектов просто предоставляют объявление методов, и вам приходится писать код для методов без изменения синтаксиса ядра, предоставляемого менеджером.так вот как абстрактный класс используется полностью.в простом методе класса определяют, объявляют и кодируют одновременно, но не в абстрактных классах.Например: -

abstract class Test
{
    abstract void show();//method provided
}
class Child extends Test
{
    void show()//coding 
    {
        System.out.println("saurav");
    }
}
class main
{
    public static void main(String[] args) 
    {
    Test c = new Child();
    c.show();   
    }
}
0 голосов
/ 25 апреля 2017

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

0 голосов
/ 13 декабря 2015

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

0 голосов
/ 28 февраля 2013

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

abstract class Avehicle    
{  
        string fuel;  
        public void move()  
{  
 sysout("moving");  
}   
} 

но система поломки всех транспортных средств отличается

interface Ivehicle    
{  

        public void breakorstop();  
}  
class Traveler    
{  
  Ivehicle v; 
//Settrers and getters   
 public drive()  
{  
v.move();  
}  
public break()  
{  
v.breakorstop();  
}  
}

Таким образом, наконец, классы Car или Cycle или Bike могут расширить Avehicle и реализовать интерфейс Vehicle

0 голосов
/ 06 июля 2010

Абстрактные классы могут использоваться для хранения методов в «библиотеке» на основе ООП; поскольку класс не нуждается в создании экземпляра и для него не имеет смысла, общепринятой практикой является хранение общих статических методов внутри абстрактного класса.

...