정적 메서드를 사용하면 재정의 메커니즘을 올바르게 제어 할 수있는 개체가 없습니다.
일반적인 클래스 / 인스턴스 가상 메서드 메커니즘을 사용하면 다음과 같이 재정의를 미세하게 조정할 수 있습니다. 각 실제 개체는 정확히 하나의 클래스 인스턴스입니다. 해당 클래스는 재정의 동작을 결정합니다. 항상 가상 메서드에서 첫 번째 균열을 얻습니다. 그런 다음 구현을 위해 적시에 부모 메소드를 호출하도록 선택할 수 있습니다. 그런 다음 각 상위 메소드는 차례를 가져 와서 상위 메소드를 호출합니다. 이로 인해 부모 호출이 연속적으로 진행되어 객체 방향으로 알려진 코드 재사용 개념 중 하나를 달성합니다. (여기서 기본 / 수퍼 클래스의 코드는 비교적 복잡한 방식으로 재사용되고 있습니다. OOP에서 코드 재사용에 대한 또 다른 직교 개념은 단순히 동일한 클래스의 여러 객체를 갖는 것입니다.)
기본 클래스는 다양한 하위 클래스에서 재사용 할 수 있으며 각 클래스는 편안하게 공존 할 수 있습니다. 자신의 행동을 지시하는 객체를 인스턴스화하는 데 사용되는 각 클래스는 다른 클래스와 평화롭게 동시에 공존합니다. 클라이언트는 객체를 인스턴스화하고 원하는대로 다른 클래스로 전달하는 데 사용할 클래스를 선택하여 원하는 동작과시기를 제어 할 수 있습니다.
(물론 항상 지원되지 않는 기능을 식별 할 수 있기 때문에 완벽한 메커니즘은 아닙니다. 이것이 팩토리 메소드 및 종속성 주입과 같은 패턴이 맨 위에 배치되는 이유입니다.)
따라서 다른 것을 변경하지 않고 정적에 대한 재정의 기능을 만들려면 재정의를 주문하는 데 어려움이 있습니다. 재정의 적용에 대해 제한된 컨텍스트를 정의하기가 어려우므로 객체와 같이 로컬보다 재정의를 전역 적으로 얻을 수 있습니다. 비헤이비어를 전환 할 인스턴스 객체가 없습니다. 따라서 누군가 다른 클래스에 의해 재정의 된 정적 메서드를 호출 한 경우 재정의를 제어해야합니까? 그러한 재정의가 여러 개인 경우 누가 먼저 통제권을 얻습니까? 둘째? 인스턴스 객체 재정의를 사용하면 이러한 질문에 모두 의미 있고 합리적인 답변이 있지만 정적으로는 그렇지 않습니다.
정적에 대한 재정의는 실질적으로 혼란 스러울 수 있으며 이와 같은 작업은 이전에 수행되었습니다.
예를 들어, Mac OS System 7 및 이전 버전에서는 운영 체제보다 먼저 응용 프로그램에서 만든 시스템 호출을 제어하여 시스템을 확장하기 위해 트랩 패치 메커니즘을 사용했습니다. 시스템 호출 패치 테이블 은 단일 전역 테이블이라는 점을 제외하고 인스턴스 객체 의 vtable 과 매우 유사한 함수 포인터의 배열로 생각할 수 있습니다.
이것은 트랩 패치의 질서 정연한 특성으로 인해 프로그래머에게 말할 수없는 슬픔을 초래했습니다. 트랩을 패치해야하는 사람은 원치 않더라도 기본적으로 이깁니다. 트랩의 각 패치는 일종의 상위 호출 기능에 대해 이전 트랩 값을 캡처하며, 이는 매우 취약했습니다. 패치를 제거하는 데 필요한 정보가 없기 때문에 시스템 호출에 대해 더 이상 알 필요가 없을 때 트랩 패치를 제거하는 것은 잘못된 형식으로 간주되었습니다. 당신).
이것은 정적 정의를 재정의하는 메커니즘을 만드는 것이 불가능하다는 것을 말하는 것이 아니라 정적 필드와 정적 메소드를 메타 클래스의 인스턴스 필드와 인스턴스 메소드로 바꾸어 정상적인 객체를 만드는 것입니다 오리엔테이션 기술이 적용됩니다. 주뿐만 아니라이 작업을 수행 할 시스템이 있다는 것을 : CSE 341 : 스몰 토크 클래스와 메타 클래스 ; 다음을 참조하십시오. 스몰 토크는 Java 정적과 동등한 것입니까?
합리적으로 잘 작동하려면 심각한 언어 기능 디자인을 수행해야한다고 말하고 싶습니다. 예를 들어, 순진한 접근 방식이 수행되었고 절름발이가 있었지만 매우 문제가 많았으며 불완전하고 사용하기 어려운 추상화를 제공함으로써 구조적으로 결함이있을 수 있습니다 (즉, 논쟁의 여지가 있습니다).
정적 재정의 기능을 훌륭하게 작동하도록 디자인 할 때 클래스 기반 메서드에 대한 OOP의 자연스러운 확장 인 일부 메타 클래스 형식을 발명했을 수 있습니다. 따라서이 작업을 수행하지 않을 이유가 없으며 일부 언어는 실제로 사용합니다. 아마도 많은 언어들이하지 않기로 선택하는 것이 조금 더 까다로운 요구 사항 일 것입니다.
self
클래스의 인스턴스가 아닌 클래스를 가리키는 포인터를 전달받습니다 .