언제 구현하고 확장해야합니까? [닫은]


90
  • 때해야 implement또는 extend사용?
  • 실제 사례는 무엇입니까?

이 올바른지?

구현 은 특정 메서드가 클래스에 존재하고 이러한 메서드 함수 호출의 형식이 적절하게 지정되도록하는 방법으로 보입니다. 구현은 변수 나 "설정"을 클래스에 전달하는 방법 이 아닙니다 .

예상되는 실제 시나리오 : 동일한 디자인을 따르는 여러 결제 클래스를 갖춘 전자 상거래 플랫폼이 있습니다. 새로운 지불 클래스를 추가해야 할 때 interface처음부터 모든 비트와 조각이 있는지 확인하기 위해 의 정의 된 디자인을 따르는 것이 정말 쉽습니다 .

클래스를 확장 하면 확장 (자식?) 클래스가 private?로 선언 된 메서드 및 변수를 제외하고 부모 클래스의 모든 것을 상속받습니다 .

예상되는 실제 시나리오 :sessions이라는 두 개의 자식 클래스로 호출 된 하나의 클래스가 있습니다 . 그리고 , 부모 세션에서 여러 상호 구성 옵션을 상속하여 모든 종류의 최종 방문자 데이터 스토리지에 영향을 미치는 구성 옵션을 쉽게 변경할 수 있습니다.sessioncookiesdatabasesessionssessioncookiesdatabasesessions


1
상속에 대해 읽어 보는 것이 좋습니다.
Rafe Kettler

답변:


64

상속은 다시 작성하는 코드의 양을 줄이는 데 유용합니다. 몇 가지 공통 메서드 또는 필드가있는 여러 클래스가있는 경우 이러한 메서드와 필드를 반복해서 정의하는 대신 기본 클래스로 팩터링하고 각 자식 클래스가 해당 기본 클래스를 확장하도록 할 수 있습니다.

인터페이스 (및 implements)는 개체 그룹의 동작 방식에 대한 공통 프로토콜 을 정의하려는 경우 유용 합니다. 예를 들어, 비교할 수있는 객체를 동등성 및 해시 등을 위해 비교할 수 있도록 명령 할 수 있습니다.

상속을 사용하는 것은 궁극적으로 디자인 선택입니다. 여러 클래스에서 동일한 메소드를 정의하는 경우를주의하십시오. 이러한 메서드를 기본 클래스로 분리 할 수있는 훌륭한 사례입니다. 동일한 특성 중 일부를 관찰하는 클래스도 마찬가지입니다. 해당 특성을 관련 클래스에서 구현할 인터페이스에 배치하여 일관성을 보장 할 수 있습니다.

상속은 PHP를 넘어서는 OOP의 큰 개념입니다. 상속에 대한 위키피디아 기사Gang of Four의 디자인 패턴 을 읽어 보는 것이 좋습니다 .

나는 상속에 대한 당신의 이해가 주로 정확하다고 믿습니다. 다음 단계는 프로덕션에서 사용하는 것입니다.


4
이제 많은 사람들이 The Gang of Four 책이 재료 측면에서 디자인 패턴에 대한 소개로 너무 무겁다 고 생각합니다. 인기있는 대안은 Head First : Design Patterns입니다. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan

1
"여러 클래스에 걸쳐 동일한 메서드를 정의하는 경우에주의하십시오. 이러한 메서드를 기본 클래스로 분리 할 수있는 훌륭한 사례입니다." 클래스를 확장하는 것이 이러한 메서드를 정의하기 위해 특성을 사용하는 것보다 이점이 있습니까?
Daniel Weiner

1
"상속은 재 작성하는 코드의 양을 줄이는 데 유용합니다."-상속의 목적은 코드가 아니라 동작을 공유하는 것입니다. 가능한 경우 특성은 추상 클래스를 공통점이없는 구체적인 클래스로 확장하는 대신 코드를 공유하는 방법입니다. 일반적으로 클래스를 is-a 관계가 아닌 has-a 관계로 모델링 할 수 있으므로 코드 재사용 성과 다형성을 더욱 용이하게 할 수 있습니다.
Duncan

12

도구:

인터페이스는 추상 클래스이므로 선언 만 할 수 있습니다. 클래스는 인터페이스를 구현합니다. 여러 인터페이스 를 구현할 있습니다.

넓히다:

당신은 확장 당신이 할 때 클래스를 보다 구체적인 버전 클래스를.

예:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

낙타와 개는 모두 동물이므로 Animal클래스 를 확장 합니다. 하지만 개는이다 특정 종류Animal또한 될 수 있습니다Pet

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