2013-06-15 8 views
3

가상 플랫폼을 대상으로하는 객체 지향 언어 용 컴파일러를 개발 중입니다. 크로스 플랫폼 추상화 레이어로 사용하고 있다고 썼습니다. 나는 상속 된 메서드가 어떻게 작동하는지 혼란 스럽다. C# 코드의 다음 줄이 있다고 가정 해 보겠습니다.컴파일러가 가상/재정의 된 메서드를 컴파일하는 방법

class myObject : Object { 
public int aField; 
public override string ToString() { 
    return "Dis be mah object"; 
} 
public void regularMethod() { } 
} 
Object test = new myObject(); 
Console.WriteLine(test.ToString()); 

이제 'Dis be mah object'가 출력됩니다. 상속 된 메서드 ToString이 컴파일 후

struct myObject { 
    public int aField; 
} 

public static void regularMethod(ref myObject thisObject) 
{ 
} 

을 처리 할 것입니다 방법 : 컴파일 된 코드는 실제로 같은 것을 할 것이다 그러나 나는 regularMethod라고하면? 컴파일러는 regularMethod에서 수행 한 작업을 컴파일러에서 수행 할 수 없었습니다. 그렇다면 'mah object는 Dispose가 될 것입니다'는 myObject 유형을 생성 할 때 일반 Object 유형이 아닌 경우에만 리턴되기 때문입니다. 내 생각 엔 struct myObject는 새로운 인스턴스가 생성 될 때 할당되는 함수 포인터/델리게이트를 포함 할 것입니다.

+0

[Late Answer] 그 방법에는 여러 가지가 있습니다. Check @ 일반적인 구현을위한 Walter Macambira 대답 – umlcat

답변

1

정적 오버로드를 다루는 경우에는 코드를 처리 할 때 올바른 구현에 바인딩하는 것이 매우 간단합니다.

그러나 동적 오버로드로 작업하는 경우 런타임에 상황을 결정해야합니다. 이를 위해 다이나믹 디스패치을 실제 오브젝트 유형을 사용하여 사용해야합니다. 이는 메서드가을 재정의하여 수행되는 것과 동일합니다.

동적 발송은 후기 바인딩과 동일하지 않습니다. 여기서, 당신은 당신의 연산을위한 이름이 아닌 구현체를 chosing하고있다. (이 바인딩이 컴파일 타임에 일어날지라도, 구현은 런타임에만 일어날 것이다.)

정적으로, 선언 된 객체 유형의 구현에만 정적으로 바인딩 할 수 있습니다. 컴파일 할 때 수행됩니다.

동적 디스패치를 ​​달성하는 데 사용할 수있는 메커니즘이 언어 패러다임을 결정합니다.

언어를 입력하셨습니까? 약식 입력?

예를 들어, C++은 위에서 언급 한 두 가지 유형의 디스패치를 ​​제공합니다. 동적 인 (나는 당신이 관심이있는 것으로 믿는다)의 경우, 가상 테이블을 사용하여 하나의 클래스에 대한 매핑을 수행한다. 해당 클래스의 각 인스턴스는 해당 vtable에 대한 포인터를 가리 킵니다.

가 VTABLE (동일 클래스의 모든 오브젝트에 대한 하나)이 동적으로 바인딩 된 모든 메소드의 주소를 가질 것이다 구현

  • . 이러한 주소 중 하나는 전화가 걸리면이 테이블에서 가져옵니다. 타입 호환 객체는 모든 호환 가능한 클래스의 메소드에 대해 동일한 오프셋을 갖는 주소를 갖는 테이블을 갖는다.

    희망이 있습니다.

+0

현재 내 언어는 약하게 입력되어 있습니다. 고마워, 그게 내가 정확히 무엇을 찾고 있었는지. – user1454902