PHP에서 인터페이스의 요점은 무엇입니까?


224

인터페이스를 사용하면이를 구현하는 클래스의 메소드를 정의하는 코드를 작성할 수 있습니다. 그러나 이러한 메소드에는 코드를 추가 할 수 없습니다.

추상 클래스를 사용하면 메소드에 코드를 추가하는 것과 동일한 작업을 수행 할 수 있습니다.

이제 추상 클래스로 동일한 목표를 달성 할 수 있다면 왜 인터페이스 개념이 필요한가?

나는 그것이 C ++에서 Java에 이르기까지 OO 이론과 관련이 있다고 들었습니다. 이는 PHP의 OO가 기반으로하는 것입니다. 이 개념은 Java에서는 유용하지만 PHP에서는 유용하지 않습니까? 추상 클래스에서 자리 표시자가 흩어지지 않도록하는 방법일까요? 뭔가 빠졌습니까?


4
읽어야합니다. stackoverflow.com/a/384067/14673
Luc M

확실히 정신적 도움이되고 의사 소통이 도움이됩니다. 인터페이스는 API에 대한 훌륭한 교육 도구 역할을합니다. API는 구현에 대해 알지 않고도 읽을 수있는 추상적 인 방식으로 API가 제공하는 서비스를 묶기 때문입니다. 이것은 비싸지 만 인터페이스에 익숙한 사람들은 클래스를 사용하지 않고도 이미 함수를 직접 사용할 수 있으므로 포인터를 절약 할 수 있습니다. 언어 정의 인터페이스가 없으면 "언어를 oop"하는 데 익숙한 사람들이 종종 종이가 아닌 인터페이스로 디자인하는 것을 선호하기 때문에 많은 프로그래머를 위해 미리 계획하기가 까다로울 수 있습니다.
Dmitry

답변:


142

인터페이스의 전체 요점은 클래스가 여러 인터페이스를 강제로 구현할 수있는 유연성을 제공하지만 여전히 여러 상속을 허용하지 않는 것입니다. 여러 클래스에서 상속받는 문제는 다양하고 다양하며 위키 백과 페이지가 요약되어 있습니다.

인터페이스는 타협입니다. 다중 상속과 관련된 대부분의 문제는 추상 기본 클래스에는 적용되지 않으므로 요즘 대부분의 현대 언어는 다중 상속을 비활성화하지만 추상 기본 클래스 인터페이스를 호출하고 클래스가 원하는 수만큼 "구현"할 수 있도록합니다.


39
* 인터페이스는 구현이 0 인 클래스를위한 디자인을 제공한다고 말할 수 있습니다. * 추상 클래스는 구현과 함께 일부 디자인을 제공합니다. 추상 클래스는 하위 클래스가 일부 구현 유사성을 공유하지만 특정 구현이 다른 경우에 가장 유용합니다.
Jrgns

@Craig, 다중 상속에는 본질적인 문제가 없습니다. 단지 현재 언어가 언어를 제대로 구현할만큼 강력하지 않다는 것입니다. 예를 들어, 동일한 이름의 상속 된 함수에 대한 명시 적 상속 경로가 다이아몬드 딜레마를 해결할 수 있다고 말하면 "문제"는 실제로 쉽게 수정 될 수 있습니다.
Pacerier

15
그것은 인터페이스에 관한 것이 아닙니다. 다중 상속에 대한 타협은 아니며, 구현할 객체와 다른 객체 / 메소드가 소비 할 개념적이고 추상적 인 계약을 만드는 것입니다. 인터페이스는 다형성을위한 도구이며 직접 상속이 아닙니다.
Madara의 유령

123

이 개념은 객체 지향 프로그래밍에서 유용합니다. 저는 인터페이스를 계약이라고 생각합니다. 오랫동안 귀하의 클래스와 귀하의 클래스는이 인터페이스 서명 계약에 동의합니다. 추상 클래스에 관해서는 일부 메소드를 스터브하는 기본 클래스로 더 많이보고 세부 사항을 채워야합니다.


이것은 나를 조금 이해하게했습니다. 네임 스페이스와 마찬가지로 공유 코드를 사용하기 쉽고 충돌없이 사용할 수 있습니다. 두 사람이 같은 기초에서 수업을 할 때 더 쉽습니다.
RedClover

'인터페이스'의 일반적인 개념을 PHP와 같은 언어의 구체적인 인터페이스와 구별 할 필요가 없습니까? 예를 들어, 모든 함수에는 "인터페이스"가있어이를 사용하는 방법을 정의하고 구현을 숨 깁니다. 따라서 이러한 "계약"인터페이스에는 특별한 언어 기능이 필요하지 않습니다. 따라서 언어 기능은 다른 것 (또는 그 밖의 것)을위한 것이어야합니다.
UuDdLrLrSs

70

이미 추상 클래스가 있다면 왜 인터페이스가 필요한가? 다중 상속을 방지하려면 (여러 알려진 문제가 발생할 수 있음)

그러한 문제 중 하나 :

"다이아몬드 문제"(때때로 "치명적인 죽음의 다이아몬드"라고도 함)는 두 클래스 B와 C가 A에서 상속되고 클래스 D가 B와 C에서 모두 상속 될 때 발생하는 모호성입니다. B와 C가 재정의되었고 D가이를 재정의하지 않고 D가 어떤 버전의 메소드를 상속합니까? B의 버전입니까, C의 버전입니까?

출처 : https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

왜 / 언제 인터페이스를 사용해야합니까? 예는 ... 세계의 모든 자동차가 동일한 인터페이스 (방법)을 가지고 ... AccelerationPedalIsOnTheRight(), BrakePedalISOnTheLeft(). 각 자동차 브랜드에 이러한 "방법"이 다른 브랜드와 다를 것이라고 상상해보십시오. BMW는 오른쪽에 브레이크가 있고 Honda는 휠 왼쪽에 브레이크가 있습니다. 사람들은 다른 브랜드의 자동차를 구입할 때마다 이러한 "방법"이 어떻게 작동 하는지를 배워야했습니다. 따라서 여러 "장소"에서 동일한 인터페이스를 사용하는 것이 좋습니다.

인터페이스는 어떤 역할을합니까 (왜 누군가 인터페이스를 사용합니까)? 인터페이스는 "실수"를 방지합니다 (특정 인터페이스를 구현하는 모든 클래스에는 인터페이스에있는 메소드가 모두 포함됨).

// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{   
    public function Create($personObject);
}

class MySqlPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Create a new person in MySql database.
    }
}

class MongoPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
    }
}

Create()방법은 항상 같은 방식으로 사용됩니다. 우리가 MySqlPerson클래스를 사용하는지 또는 클래스를 사용하는지는 중요하지 않습니다 MongoPerson. 메소드를 사용하는 방법은 동일하게 유지됩니다 (인터페이스는 동일하게 유지됨).

예를 들어, 코드의 어느 곳에서나 다음과 같이 사용됩니다.

new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);

이런 식으로 이런 일이 일어날 수 없습니다 :

new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);

하나의 인터페이스를 기억하고 여러 개의 다른 인터페이스보다 동일한 인터페이스를 사용하는 것이 훨씬 쉽습니다.

이런 식으로, Create()이 메소드를 호출하는 "외부"코드에 영향을주지 않고 메소드 내부가 클래스마다 다를 수 있습니다. 외부 코드는 메소드 Create()가 1 개의 매개 변수 ( $personObject)를가집니다. 외부 코드가 메소드를 사용 / 호출하는 방식이기 때문입니다. 외부 코드는 메소드 내부에서 일어나는 일을 신경 쓰지 않습니다. 사용 / 호출 방법 만 알고 있으면됩니다.

인터페이스 없이도이 작업을 수행 할 수 있지만 인터페이스를 사용하는 경우 "safer"(실수하지 않기 때문에)입니다. 인터페이스 Create()는 인터페이스를 구현하는 모든 클래스에서 메소드 가 동일한 서명 (동일한 유형 및 동일한 수의 매개 변수)을 갖도록합니다. 이렇게하면 IPersonService인터페이스 를 구현하는 모든 클래스가 메소드 Create()(이 예제에서)를 가지며 $personObject호출 / 사용되는 매개 변수가 하나만 필요 하다는 것을 확신 할 수 있습니다 .

인터페이스를 구현하는 클래스는 인터페이스가 가지고 있거나 가지고있는 모든 메소드를 구현해야합니다.

나는 나 자신을 너무 많이 반복하지 않기를 바랍니다.


자동차 페달과 정말 좋은 비유!
James

24

인터페이스와 추상 클래스를 사용하는 것의 차이점은 언어 자체의 적용보다 코드 구성과 관련이 있습니다. 다른 개발자가 의도 한 디자인 패턴을 유지할 수 있도록 코드를 준비 할 때 많이 사용합니다. 인터페이스는 일종의 "계약에 의한 설계"로, 코드가 사용자가없는 코드에서 발생할 수있는 규정 된 API 호출 세트에 응답하는 데 동의합니다.

추상 클래스로부터의 상속은 "is"관계이지만 항상 원하는 것은 아니며 인터페이스 구현은 "a처럼 작동"관계에 가깝습니다. 이 차이는 특정 상황에서 상당히 중요 할 수 있습니다.

예를 들어, 다른 많은 클래스가 확장하는 추상 클래스 계정 (계정 유형 등)이 있다고 가정 해 보겠습니다. 해당 유형 그룹에만 적용 할 수있는 특정 메소드 세트가 있습니다. 그러나 이러한 계정 서브 클래스 중 일부는 해당 API를 사용할 것으로 예상되는 컨트롤러에 던져 질 수 있도록 Versionable, Listable 또는 Editable을 구현합니다. 컨트롤러는 어떤 유형의 객체인지 상관하지 않습니다.

반대로 Account에서 확장되지 않고 User 추상 클래스라고 말하고 여전히 Listable 및 Editable을 구현하지만 Versionable은 구현하지 않는 객체를 만들 수도 있습니다.

이런 식으로 FooUser 서브 클래스는 계정이 아니지만 DOES는 편집 가능한 객체처럼 작동합니다. 마찬가지로 BarAccount는 Account에서 확장되지만 User 하위 클래스는 아니지만 Editable, Listable 및 Versionable을 구현합니다.

Editable, Listable 및 Versionable에 대한 이러한 모든 API를 추상 클래스 자체에 추가하면 어수선하고 추악 할뿐만 아니라 Account 및 User의 공통 인터페이스를 복제하거나 내 User 객체가 Versionable을 구현하도록 강제 할 수 있습니다. 예외.


바로 여기에 있습니다. 개발자가 분석법을 확장하거나 덮어 쓰지 않고 사용하도록 엄격하게 시행
Nick

21

인터페이스는 기본적으로 만들 수있는 것에 대한 청사진입니다. 그들은 클래스가 어떤 방법을 정의 해야합니다 ,하지만 당신은 외부에서 그 제한의 추가 방법을 만들 수 있습니다.

메서드에 코드를 추가 할 수 없다는 것이 무슨 의미인지 잘 모르겠습니다. 인터페이스를 추상 클래스 또는 확장 클래스에 적용하고 있습니까?

추상 클래스에 적용된 인터페이스의 메소드는 해당 추상 클래스에서 구현되어야합니다. 그러나 해당 인터페이스를 확장 클래스에 적용하면 메서드는 확장 클래스에서만 구현하면됩니다. 나는 여기서 틀릴 수있다-나는 가능한 한 자주 인터페이스를 사용하지 않는다.

나는 항상 인터페이스를 외부 개발자를위한 패턴으로 생각하거나 일이 올바른지 확인하기위한 추가 규칙 세트를 생각했다.


9
PHP에서 인터페이스는 실제 구현이 아닌 메소드 선언 만 포함합니다. 그러나 추상 클래스를 사용하면 메소드를 확장하는 클래스에 상속 될 메소드에 "코드를 추가"할 수 있습니다. 나는이 차이가 mk가 말한 것이라고 믿는다.
nocash

13

PHP에서 인터페이스를 사용합니다 :

  1. 구현을 숨기려면-객체 클래스에 대한 액세스 프로토콜을 설정하고 해당 객체를 사용한 모든 장소에서 리팩토링하지 않고 기본 구현을 변경하십시오.
  2. 유형을 확인하려면-매개 변수에 특정 유형이 있는지 확인하십시오 $object instanceof MyInterface
  3. 런타임에 매개 변수 검사를 시행하려면
  4. 단일 클래스에 여러 동작을 구현하려면 (복잡한 유형 작성)

    Car 클래스는 EngineInterface, BodyInterface, SteeringInterface {

이렇게하는 Car목적 캘리포니아 지금 start(), stop()(EngineInterface) 또는 goRight(), goLeft()(스티어링 인터페이스)

내가 지금 생각할 수없는 다른 것들

숫자 4 아마도 추상 클래스로는 해결할 수없는 가장 확실한 사용 사례 일 것입니다.

자바 생각에서 :

인터페이스는 "이것은이 특정 인터페이스를 구현하는 모든 클래스의 모습"이라고 말합니다. 따라서 특정 인터페이스를 사용하는 모든 코드는 해당 인터페이스에 대해 어떤 메소드를 호출 할 수 있는지를 알고 있습니다. 따라서 인터페이스는 클래스 간 "프로토콜"을 설정하는 데 사용됩니다.


10

인터페이스는 클래스를 확장 할 수있는 기반이 아니라 필요한 함수의 맵으로 존재합니다.

다음은 추상 클래스에 맞지 않는 인터페이스를 사용하는 예입니다.
사용자가 외부 소스에서 캘린더 데이터를 가져올 수있는 캘린더 애플리케이션이 있다고 가정하겠습니다. 각 유형의 데이터 소스 (ical, rss, atom, json) 가져 오기를 처리하는 클래스를 작성합니다. 각 클래스는 모두 애플리케이션이 데이터를 가져 오는 데 필요한 공통 공용 메소드를 갖도록 공통 인터페이스를 구현합니다.

<?php

interface ImportableFeed 
{
    public function getEvents();
}

그런 다음 사용자가 새 피드를 추가하면 피드 유형을 식별하고 해당 유형에 맞게 개발 된 클래스를 사용하여 데이터를 가져올 수 있습니다. 특정 피드에 대한 데이터를 가져 오기 위해 작성된 각 클래스는 완전히 다른 코드를 갖습니다. 그렇지 않으면 내 응용 프로그램에서 사용할 수있는 인터페이스를 구현해야한다는 사실 외에 클래스간에 유사성이 거의 없을 수 있습니다. 추상 클래스를 사용하는 경우 getEvents () 메서드를 재정의하지 않았다는 사실을 쉽게 무시할 수 있습니다.이 이벤트에서 응용 프로그램을 중단하고 인터페이스를 사용하면 메서드 중 하나라도 응용 프로그램을 실행할 수 없습니다 인터페이스에 정의 된 인터페이스가 인터페이스를 구현 한 클래스에 없습니다. 내 앱은 피드에서 데이터를 가져 오는 데 사용하는 클래스를 신경 쓸 필요가 없습니다.

한 걸음 더 나아 가기 위해 다른 피드 유형을 추가하려는 의도로 캘린더 앱으로 돌아올 때 인터페이스가 매우 유용합니다. ImportableFeed 인터페이스를 사용하면이 인터페이스를 구현하는 새 클래스를 추가하여 다른 피드 유형을 가져 오는 클래스를 계속 추가 할 수 있습니다. 내 핵심 응용 프로그램은 내 새로운 피드 가져 오기 클래스가 ImportableFeed 인터페이스를 구현하는 한 인터페이스에 필요한 공용 메서드 만 사용하므로 핵심 응용 프로그램에 불필요하게 대량으로 추가하지 않고도 많은 기능을 추가 할 수 있습니다. 그냥 제자리에 놓고 계속 움직일 수 있습니다.

이것은 매우 간단한 시작입니다. 그런 다음 클래스가 처리하는 피드 유형에 따라 더 많은 기능을 제공하는 모든 캘린더 클래스에 구현할 수있는 다른 인터페이스를 만들 수 있습니다. 또 다른 좋은 예는 피드 유형 등을 확인하는 방법입니다.

이것은 의문의 여지가 없지만 위의 예를 사용했기 때문에 인터페이스는 이러한 방식으로 사용되는 경우 자체 문제 세트와 함께 제공됩니다. 인터페이스와 일치하도록 구현 된 메소드에서 반환되는 출력을 보장하고 PHPDoc 블록을 읽고 IDE를 사용하여 반환 유형을 인터페이스의 PHPDoc 블록에 유형 힌트로 추가해야합니다. 그것을 구현하는 구체적인 클래스로 번역하십시오. 이 인터페이스를 구현하는 클래스의 데이터 출력을 소비하는 내 클래스는 최소한이 예제에서 배열이 반환 될 것으로 예상합니다.

<?php
interface ImportableFeed 
{
    /**
     * @return array
     */
    public function getEvents();
}

추상 클래스와 인터페이스를 비교할 공간이 많지 않습니다. 인터페이스는 단순히 구현할 때 클래스에 공용 인터페이스 세트가 있어야하는 맵입니다.


좋은 설명 :) 감사합니다!
Razvan.432

정보를 추가하려면 : 추상 클래스에서 메소드를 abstract로 선언하면 인터페이스처럼 작동하므로 getEvents ()를 재정의하지 않았다는 사실을 무시할 수 없습니다. 앱은 인터페이스와 같은 방식으로 실패합니다.
Rikudou_Sennin

8

인터페이스는 개발자가 특정 메소드를 구현하도록하기위한 것이 아닙니다. 이러한 클래스에는 특정 메소드가 보장되므로 클래스의 실제 유형을 모르더라도 이러한 메소드를 사용할 수 있습니다. 예:

interface Readable {
  String read();
}

List<Readable> readables; // dunno what these actually are, but we know they have read();
for(Readable reader : readables)
  System.out.println(reader.read());

구현이 크게 다르고 몇 가지 메소드 외에 공통적 인 것을 공유하지 않기 때문에 대부분의 경우 추상 또는 기본 클래스를 제공하는 것은 이치에 맞지 않습니다.

동적으로 유형이 지정된 언어에는 인터페이스가 필요없는 "덕 타이핑"이라는 개념이 있습니다. 당신은 객체가 당신이 호출하는 메소드를 가지고 있다고 가정 할 수있다. 이 방법은 객체에 메소드가 있지만 (내 예제에서는 read ()) 정적 유형의 언어에서 문제를 해결하지만 인터페이스를 구현하지 않습니다.


6

제 생각에는 비 기능적 추상 클래스보다 인터페이스가 선호되어야합니다. 인스턴스화 된 객체가 하나만 있기 때문에 성능 저하가 발생하더라도 놀라지 않을 것입니다. 두 개를 파싱하는 대신 결합하여 (내부 작업에 익숙하지는 않지만 확실하지는 않지만) OOP PHP).

인터페이스가 Java와 비교할 때보 다 유용하거나 의미가 없다는 것이 사실입니다. 반면에, PHP6는 반환 값에 대한 유형 힌트를 포함하여 훨씬 더 많은 유형 힌트를 제공합니다. 이것은 PHP 인터페이스에 가치를 더해야합니다.

tl; dr : 인터페이스는 따라야 할 메소드 목록을 정의하고 (API 생각), 추상 클래스는 기본 / 공통 기능을 제공하며 서브 클래스는 특정 요구에 맞게 수정됩니다.


PHP 6은 출시되지 않습니다. PHP 6은 2005-2010 년에 개발중인 프로젝트이지만 지연되어 결국 취소되었습니다. PHP 7은 이전 버전의 PHP 6 프로젝트와 혼동을 피하기 위해 다음 버전입니다.
Ashu Jha

5

PHP가 이와 관련하여 다른지 기억할 수 없지만 Java에서는 여러 인터페이스를 구현할 수 있지만 여러 추상 클래스를 상속 할 수는 없습니다. PHP가 같은 방식으로 작동한다고 가정합니다.

PHP에서는 쉼표로 구분하여 여러 인터페이스를 적용 할 수 있습니다 (정확한 soloution을 찾지 못했습니다).

여러 추상 클래스에 대해서는 서로 확장하는 여러 초록을 가질 수 있습니다 (다시 말하지만, 나는 그것에 대해 완전히 확신하지는 않지만 이전에 어딘가에서 본 적이 있다고 생각합니다). 확장 할 수없는 유일한 것은 마지막 수업입니다.


4

인터페이스는 코드에 성능 향상이나 이와 유사한 것을 제공하지는 않지만 유지 관리가 가능하도록 먼 길을 갈 수 있습니다. 추상 클래스 (또는 추상이 아닌 클래스)를 사용하여 코드에 대한 인터페이스를 설정할 수 있지만 적절한 인터페이스 (키워드로 정의하고 메소드 서명 만 포함하는 인터페이스)는 훨씬 쉽습니다. 정렬하고 읽습니다.

즉, 클래스를 통해 인터페이스를 사용할지 여부를 결정할 때 재량을 사용하는 경향이 있습니다. 때로는 기본 메소드 구현 또는 모든 서브 클래스에 공통적 인 변수를 원합니다.

물론 다중 인터페이스 구현에 대한 요점도 건전합니다. 여러 인터페이스를 구현하는 클래스가 있으면 해당 클래스의 객체를 동일한 응용 프로그램에서 다른 유형으로 사용할 수 있습니다.

그러나 PHP에 관한 질문은 상황을 조금 더 흥미롭게 만듭니다. PHP에서 인터페이스에 입력하는 것은 여전히 ​​필요하지 않습니다. 여기서 유형에 관계없이 모든 메소드에 거의 모든 것을 공급할 수 있습니다. 메소드 매개 변수를 정적으로 입력 할 수는 있지만 일부 매개 변수가 손상되었습니다 (String, 나는 약간의 딸꾹질을 일으킨다). 대부분의 다른 참조를 입력 할 수 없다는 사실과이를 결합하고 PHP에서 정적 입력을 강제로 시도하는 데는 가치가 없습니다 ( 이 시점에서 ). 그리고 그 때문에, 인터페이스의 값을 PHP에서 , 이 시점에서보다 강력한 형식의 언어보다 훨씬 적습니다. 그들은 가독성의 이점을 가지고 있지만 다른 것은 거의 없습니다. 다중 구현은 메서드를 선언하고 구현 자 내에 본문을 제공해야하기 때문에 유익하지 않습니다.


2

다음은 PHP 인터페이스에 대한 요점입니다

  1. 클래스에 필요한 메소드를 정의하는 데 사용됩니다 [html을로드하려면 id와 이름이 필요하므로이 경우 인터페이스에 setID 및 setName 포함].
  2. 인터페이스는 클래스가 정의한 모든 메소드를 포함하도록 강제합니다.
  3. 공용 접근성과의 인터페이스에서만 메소드를 정의 할 수 있습니다.
  4. 클래스와 같은 인터페이스를 확장 할 수도 있습니다. extends 키워드를 사용하여 PHP에서 인터페이스를 확장 할 수 있습니다.
  5. 여러 인터페이스를 확장하십시오.
  6. 둘 다 동일한 이름의 기능을 공유하는 경우 2 개의 인터페이스를 구현할 수 없습니다. 오류가 발생합니다.

예제 코드 :

interface test{
    public function A($i);
    public function B($j = 20);
}

class xyz implements test{
    public function A($a){
        echo "CLASS A Value is ".$a;
    }
    public function B($b){
        echo "CLASS B Value is ".$b;
    }
}
$x = new xyz();
echo $x->A(11);
echo "<br/>";
echo $x->B(10);

2

우리는 추상 클래스와 인터페이스가 자식 클래스에서 구현되어야하는 추상 메소드를 제공한다는 점에서 비슷하다는 것을 알았습니다. 그러나 여전히 다음과 같은 차이점이 있습니다.

1. 인터페이스에는 추상 메서드와 상수가 포함될 수 있지만 구체적인 메서드와 변수는 포함 할 수 없습니다.

2. 인터페이스의 모든 메소드는 공개 가시성 범위 에 있어야합니다 .

3. 클래스는 하나 이상의 인터페이스를 구현할 수 있지만 하나의 추상 클래스에서만 상속 할 수 있습니다.

                                  interface                      abstract class
the code                     - abstract methods               - abstract methods
                             - constants                      - constants                  
                                                              - concrete methods
                                                              - concrete variables

access modifiers             
                             - public                         - public
                                                              - protected
                                                              - private
                                                                etc.
number of parents          The same class can implement
                           more than 1 interface              The child class can 
                                                              inherit only from 1 abstract class

이것이 누군가에게 이해하는 데 도움이되기를 바랍니다!


2

인터페이스는 당신의 유전자와 같습니다.

추상 수업은 실제 부모와 같습니다.

그들의 목적은 유전 적이지만 추상 클래스 대 인터페이스의 경우 상속되는 것이 더 구체적입니다.


2

나는 다른 언어에 대해 모른다, 인터페이스의 개념은 무엇인가. 그러나 PHP의 경우 최선을 다해 설명 할 것입니다. 인내심을 갖고 도움이된다면 의견을 말하십시오.

인터페이스는 "계약"으로 작동하여 서브 클래스 세트의 기능을 지정하지만 서브 클래스의 기능은 지정하지 않습니다.

규칙

  1. 인터페이스를 인스턴스화 할 수 없습니다.

  2. 인터페이스에서 메소드를 구현할 수 없습니다. 즉, 메소드의 서명 만 포함하고 세부 사항 (본문)은 포함하지 않습니다.

  3. 인터페이스는 메소드 및 / 또는 상수를 포함 할 수 있지만 속성은 없습니다. 인터페이스 상수는 클래스 상수와 동일한 제한이 있습니다. 인터페이스 메소드는 내재적으로 추상적입니다.

  4. 인터페이스는 생성자 또는 소멸자를 선언하면 안됩니다. 클래스 또는 클래스 수준의 구현 세부 정보입니다.

  5. 인터페이스의 모든 메소드는 공개 가시성을 가져야합니다.

이제 예를 들어 봅시다. 두 개의 장난감이 있다고 가정 해 봅시다. 하나는 개이고 다른 하나는 고양이입니다.

우리는 개 짖는 소리와 고양이 ws을 알고 있습니다.이 두 개는 동일한 말하기 방법을 가지고 있지만 기능이나 구현이 다릅니다. 말하기 버튼이있는 리모컨을 사용자에게 제공한다고 가정합니다.

사용자가 말하기 버튼을 누를 때 장난감은 말이나 고양이인지 상관 없습니다.

구현이 다르기 때문에 추상 클래스가 아닌 인터페이스를 사용하는 것이 좋습니다. 왜? 생각해 내다

비 추상적 방법을 추가하여 자식 클래스를 지원해야하는 경우 추상 클래스를 사용해야합니다. 그렇지 않으면 인터페이스를 선택할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.