2010-07-05 4 views
16

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

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

+7

Будет ли downvoters, пожалуйста, укажите, почему вы отвечаете на вопросы?!?! – apollodude217

ответ

14

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

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

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

+26

-1 для сбивающих с толку и непрактичных аналогов животных. –

+6

Непрактичная аналогия животных использовалась для облегчения путаницы «интерфейса против абстрактного». Кстати, насколько непрактичным является любая версия Hello World? Практика не имеет к этому никакого отношения. Кроме того, я вижу, что эта аналогия чрезвычайно практична во многих приложениях и/или играх. – AlvinfromDiaspar

+0

@AlvinfromDiaspar +1 Ну, я думаю, что это самое простое объяснение в мире – Rohit

-2

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

+0

«В Java вы также можете объявить класс окончательным, чтобы он не расширялся». Нет, вы не можете. 'abstract' +' final' не допускается. Если ваш класс предназначен исключительно для статических методов утилиты, он, вероятно, должен быть окончательным классом с частным (неиспользуемым) конструктором. –

+0

@Matthew Flaschen: Точка взята. Спасибо за разъяснения. – amphetamachine

+1

Статические методы не являются основной причиной абстрактных классов. – apollodude217

8

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

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

+3

+1 для правильного короткого ответа. – apollodude217

+0

Даже если класс не имеет абстрактных членов, а созданные экземпляры имеют четко определенное поведение, может быть разумным определить класс как абстрактный, если он не содержит ничего, что могло бы различать экземпляры друг от друга. Например, можно было бы определить '' ImmutableList базовый класс с подклассами для 'ArrayBackedImmutableList ', 'ComputedImmutableList ', '' LazyImmutableList и т.д. Хотя это может быть возможно иметь экземпляры базового класса ведут себя как нуль-пункта , было бы проще определить конкретный класс 'EmptyImmutableList ' для этой цели. – supercat

-1

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

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 и может реализовать Vehicl e интерфейс

6

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

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

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

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

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

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

Абстрактные классы против регулярных занятий

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

+0

По словам ** братьев и сестер **, вы имеете в виду ребенка, считая, что абстрактный текст будет унаследован классом, сделав его родителем. Правильно ? –

+0

@DaniyalNasir да. – zgulser

0

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

0

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

+0

Что случилось ??? –

1

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

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(); 
    } 
} 
Смежные вопросы