2012-05-23 3 views
1

나는 추상 클래스와 인터페이스의 차이에 대해 배우고 있지만 이지만 실용적인 예가없는 경우 이론적 설명은 이해하기 어렵다. 읽은 내용 : 기본 클래스를 업데이트하면 모든 상속하는 클래스가 자동으로 변경되어 업데이트됩니다. 반면에 인터페이스는 생성 된 후에는 변경할 수 없습니다. 새 버전의 인터페이스가 필요한 경우 완전히 새로운 인터페이스를 만들어야합니다. 만약 누군가가 내게이 라인에 대한 실질적인 예를 제공 할 수 있습니다. 나는 매우 감사 할 것입니다. 즐거운 한 주를 기원합니다.PHP, OOP 실용 사례

+2

이 질문은 여러 번 묻고 토론했습니다 (http://stackoverflow.com/search?q=Class+vs.+Interface). –

답변

2

이 예제를 고려하십시오. 우리는 운전 가능한 인터페이스, 자동차 추상, 그리고 둘 다 사용하는 핀토 클래스를 가지고 있습니다.

interface Drivable 
{ 
    public function go(); 
} 

abstract class Automobile 
{ 
    public $type; 

    public function getType() { 
    return $this->type; 
    } 
} 

class Pinto 
    extends Automobile 
    implements Drivable 
{ 
    public function go() { 
    // code to make it go 
    } 
} 

우리는 쉽게 Automobile에서 그들을 정의하여 모든 자동차에 방법을 추가 할 수 있습니다. 거기에 추가 된 새로운 메소드는 모든 확장 클래스에서 사용할 수 있습니다.

그러나 Drivable 인터페이스에 메서드를 추가하는 경우 새 메서드를 추가하기 위해 메서드를 구현하는 모든 클래스에서 해당 메서드를 찾아 구현해야합니다. 그렇지 않으면 컴파일되지 않습니다.

예를 들어 인터페이스에 stop() 메소드를 추가한다고 가정 해 보겠습니다. Pintostop 메서드가 없으므로 즉시 오류가 발생합니다.

+1

대단히 감사합니다. 정말 유익한 설명이었습니다. 이제는 모두에게 감사드립니다. 즐거운 한 주를 기원합니다. – Blanktext

+0

@mike 아주 좋습니다. 이것은 내 머리에 혼란을 불어 넣는 마음을 해결했습니다. 좋은 예도 있습니다. – inckka

1

인터페이스를 변경할 수 있습니다. 상속하는 클래스의 모든 변경 사항 만 구현하면됩니다. 예를 들어, SpaceShip 인터페이스를 만들고 있으며 CoolEnemyShip, StupidEnemyShip, PlayerShip이 있고 Boost() 함수와 같은 새로운 기능을 추가하기 위해 SpaceShip에 새로운 함수를 추가 한 경우 3 구현에서 Boost() 함수를 구현해야합니다 (CoolEnemyShip, StupidEnemyShip, PlayerShip)

반면에 SpaceShip이 기본 클래스이고 Boost() 함수를 구현하면 모든 상속 클래스에 Boost() 함수가 생깁니다. 가장 큰 차이점은 코드를 이해하는 데 코드가 필요하지 않으며 유추만으로도 충분하다는 것입니다.

+0

첫 번째 고맙습니다. 설명이 우수함을 보여 주며 설명이 정말 훌륭하다고 상상하지만 인터페이스와 추상 클래스의 차이점을 이해하지 못합니다. 설명에 도움이되는 코드를 작성하면 도움이 될 것이라고 생각합니다. 나를 이해하고 다시 한 번 감사드립니다. – Blanktext

+0

추상 클래스 : 메소드를 구현할 수 있습니다. 인터페이스 : 구현할 메소드는 무엇입니까 – Mustafa

1

요약 기본 클래스는 클래스를 상속하는 기능을 만들기위한 것입니다.

인터페이스는이 인터페이스를 사용하는 클래스에 의해 구현되어야하는 엄격한 기능 집합을 정의하기위한 것입니다.

추상 클래스는 메소드를 추상적으로 표시하여 구현을 상속하는 클래스로 남겨놓을 수 있다는 점에서 약간 겹쳐 있습니다.

+0

여러분의 설명으로 이해한다면 추상 클래스를 사용할 때 추상 클래스를 상속받은 클래스는 Bodiless 추상 클래스 메소드를 오버라이드합니다. 또는 메소드를 계속 무시합니다. – Blanktext