>백엔드 개발 >C++ >C#에서 기본 클래스의 기본 클래스 메서드를 호출하는 방법은 무엇입니까?

C#에서 기본 클래스의 기본 클래스 메서드를 호출하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-29 15:22:14783검색

How to Call a Base Class's Base Class Method in C#?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.