В чем разница между интерфейсом и абстрактным классом? - PullRequest
1651 голосов
/ 16 декабря 2009

В чем именно разница между интерфейсом и абстрактным классом?

Ответы [ 34 ]

0 голосов
/ 03 февраля 2016

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

class Circle {

protected $radius;

public function __construct($radius)

{
    $this->radius = $radius
}

public function area()
{
    return 3.14159 * pow(2,$this->radius); // simply pie.r2 (square);
}

}

//Our area calculator class would look like

class Areacalculator {

$protected $circle;

public function __construct(Circle $circle)
{
    $this->circle = $circle;
}

public function areaCalculate()
{
    return $circle->area(); //returns the circle area now
}

}

Мы бы просто сделали

$areacalculator = new Areacalculator(new Circle(7)); 

Через несколько дней нам понадобится площадь прямоугольника, квадрата, четырехугольника и так далее. Если да, нужно ли нам каждый раз менять код и проверять, имеет ли экземпляр квадрат, или круг, или прямоугольник? Теперь, что говорит OCP, это КОДЕКС ИНТЕРФЕЙСА, а не РЕАЛИЗАЦИЯ. Решение будет:

Interface Shape {

public function area(); //Defining contract for the classes

}

Class Square implements Shape {

$protected length;

public function __construct($length) {
    //settter for length like we did on circle class
}

public function area()
{
    //return l square for area of square
}

Class Rectangle implements Shape {

$protected length;
$protected breath;

public function __construct($length,$breath) {
    //settter for length, breath like we did on circle,square class
}

public function area()
{
    //return l*b for area of rectangle
}

}

Теперь для калькулятора области

class Areacalculator {

$protected $shape;

public function __construct(Shape $shape)
{
    $this->shape = $shape;
}

public function areaCalculate()
{
    return $shape->area(); //returns the circle area now
}

}

$areacalculator = new Areacalculator(new Square(1));
$areacalculator->areaCalculate();

$areacalculator = new Areacalculator(new Rectangle(1,2));
$areacalculator->;areaCalculate();

Разве это не гибче? Если бы мы кодировали без интерфейса, мы бы проверяли экземпляр для каждого избыточного кода формы.

Теперь, когда использовать абстрактный?

Abstract Animal {

public function breathe(){

//all animals breathe inhaling o2 and exhaling co2

}

public function hungry() {

//every animals do feel hungry 

}

abstract function communicate(); 
// different communication style some bark, some meow, human talks etc

}

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

0 голосов
/ 04 сентября 2018

У нас есть различные структурные / синтаксические различия между интерфейсом и абстрактным классом. Еще несколько отличий

[1] Разница на основе сценария :

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

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

[2] Концептуальная разница :

«Нужно ли нам предоставлять больше абстрактных методов в будущем», если ДА делает его абстрактным классом, и если НЕТ, делает его Интерфейсом.

(наиболее подходящий и действительный до Java 1.7)

0 голосов
/ 17 января 2018

Общая идея абстрактных классов и интерфейсных объектов заключается в том, чтобы расширять / реализовывать другие классы (не могут быть созданы отдельно), которые используют эти общие «настройки» (своего рода шаблон), упрощая установку общихповедение для всех объектов, которые позже расширяют его.

У абстрактного класса есть обычные методы set И абстрактные методы.Расширенные классы могут включать неустановленные методы после расширения абстрактным классом.При установке абстрактных методов - они определяются классами, которые расширяют его позже.

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

0 голосов
/ 22 января 2016

enter image description here

Вот очень базовое понимание интерфейса против абстрактного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...