Преимущества использования абстрактных классов и обычных классов

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

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

8 ответов


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

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

Abstract: используйте это, если вы хотите применить базовые функции и иметь базовые свойства. например, птичий может быть базовым классом для птиц, которые могут иметь функцию, называемую LayEgg, а также свойства, называемые возрастом, видами, числом...так далее. Эти вещи не изменяют / не должны изменять поведение птицы, так как все птицы откладывают яйца...так далее. Но не все птицы звучат одинаково, когда они кричат или летают одинаково (некоторые даже не летают)....так далее.... следовательно, они должны быть реализованы через интерфейс(ы).


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

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


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

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

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

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

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

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

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

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


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

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();   
    }
}

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


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


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

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();  
}  
}

Так, наконец Автомобиль или цикл или велосипед классы могут расширить Avehicle и может реализовать интерфейс транспортного средства


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