base.base.method()를 예외적으로 호출
기본 구조에서 클래스를 파생할 때 base 키워드 직계 상위 클래스에 정의된 멤버에 대한 액세스를 허용합니다. 그러나 예외적인 상황에서는 상속 계층 구조의 상위 클래스에서 메서드를 호출해야 할 수도 있습니다.
제공된 코드 시나리오를 고려하세요. 여기서 Derived는 Say()를 재정의합니다. 베이스의 방식입니다. SpecialDerived 내에서 Say()의 후속 재정의는 base.Say()를 호출하여 Say()를 에서 실행하려고 합니다. >기본.
예상 vs. 실제 동작
예상되는 출력은 다음과 같습니다.
Called from Special Derived. Called from Base.
그러나 메서드 재정의의 특성으로 인해 실제 출력에는 Say()에서 파생:
Called from Special Derived. Called from Derived. Called from Base.
문제 해결
base.base.method()을 직접 호출한 이후 지원되지 않으므로 대체 접근 방식이 필요합니다. SpecialDerived에서 제공되는 업데이트된 구현은 다음을 보여줍니다.
class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); CustomSay(); // Calls CustomSay() from Derived instead of Say() base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from Derived."); } }
CustomSay(), Derived가 가능합니다. 다른 파생 항목에 영향을 주지 않고 원하는 동작을 처리합니다.
대체 반사 접근 방식
상속 구조를 수정할 수 없는 시나리오에서는 아래와 같이 반사 기반 접근 방식을 사용할 수 있습니다.class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer(); var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr); baseSay(); } }
Say() 메서드를 동적으로 검색합니다. 기본하고 표준 메서드 해결 프로세스를 우회하여 직접 실행합니다.
위 내용은 재정의된 파생 클래스에서 기본 클래스 메서드를 어떻게 호출할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!