Zend_Form은 상속을 위해 설계되었습니다. Zend_Form을 사용하는 동안 모든 사람들이이를 염두에 두어야합니다. 실제로는 Zend_Form이 필요하지는 않지만 그 서브 클래스가 될 수 있습니다. 따라서, 어떤 프로그램이 Zend_Form을 그대로 사용하여 서브 클래스가 동작 할 수있는 것처럼 동작하지 않는다면 그 프로그램이 잘못되었습니다. Liskov 원칙에 따라 "기본 클래스 사용"이 아니라 그것을 악용합니다.
Zend_Form은 주로 Zend 프레임 워크에서 사용되며 올바르게 사용한다고 확신합니다.
나는 상속을 위해 설계된이 클래스에 대해 어떤 프레임 워크를 기반으로하는 응용 프로그램의 빌드 블록으로 생각한다. "동작"의 정의는 더 추상적이어야한다. 클래스 자체가 추상이 아니더라도 서브 클래스에 대한 세부 사항은 남겨 두어야한다. Zend_Form의 동작은 "일부 HTML을 렌더링하고 일부 유효성 검사 규칙"을 사용한다고 말합니다. 이 의미에서 Zend_Form의 모든 하위 클래스는 같은 방식으로 동작합니다. Zend_Form non-abstract는 단지 기본 동작을 정의하므로 사용하기가 더 쉽습니다.
또한 좀 더 학문적으로하기 위해 두 클래스를 만들 수 있습니다. 하나는 모든 양식의 추상 기본 클래스 여야합니다. 비어있는 폼을위한 또 하나, 정확히 동작하고 Zend_Form은 이제 동작하고 자신 만이 사용할 수 있습니다. 그래서 프로그램에 실제 값을 추가하지 않을 ptobably Liskov 원리에 대한 혼란을 제거 할
// sorry, I don't like PHP so here goes java
public abstract class ZendForm{/*implementation here and NO abstract methods*/}
public final class DefaultZendForm extends ZendForm{/*nothing here*/}
이 같은 것을,하지만 것입니다.
하위 클래스는 수퍼 클래스와 다른 방식이어야합니다. 그렇지 않으면 하위 클래스를 만드는 것이 의미가 없습니다. 그리고 당신은 항상이 차이를 남용하고 슈퍼 클래스에서 작동하고 서브 클래스에서 실패하는 프로그램을 작성할 수 있습니다. 그러나 그것은 합리적이지 않을 것입니다. 정확히 기본 (빈) 형식을 렌더링하는 것은 Zend_Form의 계약의 일부가 아닙니다. 클래스 계약의 일부인 동작 만 LSP의 주제입니다.
프로그램의 기능이 변경 될 것입니다. 1) 다른 HTML 양식이 렌더링됩니다. 2) 유효성 검사를위한 다른 규칙이 사용될 수 있습니다. – blockhead
하위 클래스는 항상 기본 클래스와 다른 기능을 수행합니다. 그렇지 않으면 필요하지 않습니다. 그래서, 1) LSP와 모순되지 않습니다. 어쩌면 2) 위키 백과를 다시 인용하여 "또한, 그 원칙은 서브 클래스의 메소드에 의해 새로운 예외가 던져지지 않아야 함을 의미한다. 예외는 그 자체가 수퍼 클래스의 메소드에 의해 던져지는 예외의 서브 타입이다. –
실용적인 것은 Zend_Form을 확장하는 것이 더 합리적이며 학계에서는 너무 지나치지 않을 것입니다. –