콜 슈퍼
Call super콜 슈퍼는 일부 객체 지향 프로그래밍 언어의 코드 냄새 또는 안티 패턴입니다.콜 슈퍼는 특정 클래스에서 파생 서브클래스에서 사용자가 메서드를 오버라이드하고 특정 포인트에서 오버라이드된 함수 자체를 콜백해야 한다고 규정하는 설계 패턴입니다.오버라이드 방법은 의도적으로 불완전할 수 있으며, 오버라이드 방법에 의존하여 규정된 방식으로 기능을 증강할 수 있습니다.단, 언어 자체가 이 콜에 규정된 모든 조건을 적용할 수 없는 경우가 있기 때문에 이것이 안티패턴이 됩니다.
묘사
오브젝트 지향 프로그래밍에서 사용자는 서브클래스의 슈퍼클래스의 속성과 동작을 상속할 수 있습니다.서브클래스는 슈퍼클래스의 메서드를 덮어쓸 수 있으며, 슈퍼클래스의 구현을 위해 메서드의 자체 구현을 대체할 수 있습니다.경우에 따라서는 오버라이드 메서드가 슈퍼클래스의 대응하는 기능을 완전히 대체하는 경우가 있는 반면, 다른 경우에는 오버라이드 메서드에서 슈퍼클래스의 메서드를 호출해야 합니다.따라서 대부분의 프로그래밍 언어에서는 오버라이드 메서드가 슈퍼클래스에서 오버라이드 메서드를 명시적으로 호출해야 실행할 수 있습니다.
콜 슈퍼 안티 패턴은 인터페이스 또는 프레임워크의 사용자에 의존하여 특정 클래스에서 서브클래스를 도출하여 특정 메서드를 덮어쓰고 덮어쓰기 [1]메서드에서 원래 메서드를 호출해야 합니다.
이는 종종 슈퍼클래스가 클래스나 프레임워크가 올바르게 동작하기 위해 몇 가지 셋업 태스크를 수행해야 하거나 슈퍼클래스의 메인 태스크(이 메서드에 의해 수행됨)가 서브클래스에 의해서만 증강되기 때문에 필요합니다.
안티 패턴은 부모를 호출하기 위한 요건입니다.실제 코드에는 서브클래스의 메서드가 슈퍼클래스의 기능을 필요로 할 수 있는 예가 많이 있습니다.보통 상위 기능만 증강하고 있습니다.기능을 완전히 치환하고 있어도 부모 클래스를 호출할 필요가 있는 경우는 안티 패턴이 존재합니다.
이러한 문제를 해결하기 위한 보다 나은 접근법은 템플릿 메서드 패턴을 사용하는 것입니다.여기서 슈퍼클래스는 서브클래스에 의해 구현되어야 하며 원래 메서드가 이 메서드를 [1]호출하도록 해야 합니다.
언어의 변화
프로그램에서 이 안티패턴이 나타나는 것은 보통 슈퍼메서드가 파생 클래스에서 호출되는 것을 계약적으로 보증하는 기능을 제공하는 프로그래밍 언어가 거의 없기 때문입니다.이 기능을 갖춘 언어 중 하나는 베타입니다.이 기능은 Java 및 C++와 같이 제한된 방법으로 찾을 수 있으며, 여기서 자식 클래스 생성자는 항상 부모 클래스 생성자를 호출합니다.
Common Lisp(구체적으로는 Common Lisp Object System) 등 전후 메서드를 지원하는 언어에서는 이 안티패턴을 회피하는 다른 방법이 있습니다.서브클래스의 프로그래머는 슈퍼클래스의 메서드를 덮어쓰는 대신 슈퍼클래스의 메서드 전후에 실행되는 추가 메서드를 제공할 수 있습니다.또한 슈퍼클래스의 프로그래머는 서브클래스의 액션에 더해 실행이 보증되는 메서드 전, 후 및 어라운드도 지정할 수 있다.
예
비디오 대여 상점의 인벤토리에 대한 보고서를 생성하는 클래스가 있다고 가정합니다.각 점포는 현재 이용 가능한 동영상을 표로 작성하는 방법은 다르지만 최종 보고서를 생성하는 알고리즘은 모든 점포에서 동일합니다.콜 슈퍼 안티 패턴을 사용하는 프레임워크에서는 다음 추상 클래스를 제공할 수 있습니다(C#).
추상적인 학급 보고서 생성기 { 일반의 가상 리포트 보고서 작성() { // 일반 보고서 개체 생성 // ... 돌아가다 신규 리포트(...); } } 클래스 사용자는 다음과 같은 서브클래스를 구현해야 합니다.
학급 콘크리트 보고서 생성기 : 보고서 생성기 { 일반의 덮어쓰다 리포트 보고서 작성() { // 스토어 고유의 방법으로 데이터 표 작성 // ... // 이 클래스를 설계하려면 부모 CreateReport() 함수를 // 재정의된 함수의 끝.하지만 이 줄은 쉽게 빠질 수 있습니다. // 반환된 보고서는 호출 후에 더 수정되어 클래스 설계를 위반할 수 있습니다. // 전사적인 보고서 형식도 포함할 수 있습니다. 돌아가다 기초.보고서 작성(); } } 바람직한 인터페이스는 다음과 같습니다.
추상적인 학급 보고서 생성기 { 일반의 리포트 보고서 작성() { 표로 작성하다(); // 일반 보고서 개체 생성 // ... 돌아가다 신규 리포트(...); } 보호되고 있다 추상적인 무효 표로 작성하다(); } 실장은 다음과 같이 이 클래스를 덮어씁니다.
학급 콘크리트 보고서 생성기 : 보고서 생성기 { 보호되고 있다 덮어쓰다 무효 표로 작성하다() { // 스토어 고유의 방법으로 데이터 표 작성 // ... } }