base.base.method() 호출:
객체 지향 프로그래밍에서는 기본 및 파생 클래스 계층 구조를 만드는 것이 일반적입니다. 수업. 파생 클래스에서 메서드를 재정의할 때 base를 사용하여 기본 클래스 구현을 호출할 수 있습니다. 그러나 특정 시나리오에서는 기본 클래스의 기본 클래스에 액세스하려는 상황이 발생할 수 있습니다.
다음 예제 코드를 고려하세요.
class Base { public virtual void Say() { Console.WriteLine("Called from Base."); } } class Derived : Base { public override void Say() { Console.WriteLine("Called from Derived."); base.Say(); } } class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); base.Say(); } }
sd를 호출할 때. SpecialDerived 인스턴스의 경우 Say()를 사용하면 다음과 같은 출력이 나올 것으로 예상됩니다.
Called from Special Derived. Called from Derived. Called from Base.
그러나 실제로는 get:
Called from Special Derived. Called from Derived. /* this is not expected */ Called from Base.
Derived.Say()에 대한 예기치 않은 호출은 base가 항상 계층 구조의 직접적인 기본 클래스를 참조하기 때문입니다. 따라서 SpecialDerived.Say()는 Base.Say()를 호출하기 전에 Derived.Say()를 호출합니다.
이 동작을 방지하려면 base.base.method()를 직접 사용할 수 없습니다. 대신 다음 접근 방식을 활용할 수 있습니다.
class Derived : Base { public override void Say() { CustomSay(); base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from Derived."); } } class SpecialDerived : Derived { protected override void CustomSay() { Console.WriteLine("Called from Special Derived."); } }
중간 메서드 CustomSay()를 도입하면 파생 클래스 호출 체인에서 실행되는 내용을 제어할 수 있습니다. 이 경우 SpecialDerived는 자체 동작을 제공하기 위해 CustomSay()를 재정의하여 Derived.CustomSay()를 효과적으로 건너뜁니다.
또는 아래와 같이 리플렉션을 사용하여 기본 클래스 메서드 핸들에 액세스하고 직접 호출할 수 있습니다.
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(); } }
위 내용은 C#에서 기본 클래스의 기본 클래스 메서드를 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!