2012-06-08 2 views
2

조기 바인딩은 특정 데이터 형식의 개체를 선언하는 개념이며 다른 유형의 개체를 보유 할 수 없다는 것이 알려져 있습니다. 후기 바인딩은 일반 유형의 객체 선언 개념이며 다른 유형의 인스턴스를 보유 할 수 있습니다.C# 조기 및 후기 바인딩 개념

public abstract class Animal 
{ 
public virtual string Name { get { return "Animal"; } } 
} 

public class Dog : Animal 
{ 
    public override string Name { get { return "Dog"; } } 
} 

public class Cat : Animal 
{ 
    public override string Name { get { return "Cat"; } } 
} 

public class Test 
{ 
    static void Main() 
    { 
     Animal animal = new Dog(); 
     Animal animalTwo = new Cat(); 

     Console.WriteLine(animal.Name); 
     Console.WriteLine(animalTwo.Name); 
    } 
} 

내 질문은 compilor 객체의 함수 호출을 인식하거나 할 때 컴파일 시간 또는 실행 시간이 될 것입니다 : 의 예를 생각해? 불명확하면 죄송합니다. 하지만 가상 오버라이드 및 가상 메서드의 개념에 늦은 바인딩이 필요한지 아닌지 묻는 중입니다. .. 그렇다면 어떻게 가능합니까?

답변

5

런타임.

가상 함수는 런타임시 실시간 객체 참조의 함수로 전달된다는 것을 의미합니다. C++에서는 vtable이라는 포인터 테이블을 통해이 작업을 수행합니다. C#이 어떻게 동작하는지 모르겠다. 구현에 의존한다고 생각 하겠지만 결과는 같다.

컴파일 타임에 컴파일러는 함수 호출을 기본 클래스의 함수에 바인딩합니다. 이 기본 클래스 함수는 가상이므로 런타임에 .Net은 실제 객체 유형을보고 해당 함수를 재정의하는지 확인합니다. 그렇게되면 파생 된 유형이 호출됩니다.

+0

:

바인딩에 대한 자세한 내용을 알고하려면 무슨 말을 만들고,이 게시물을 읽고 난 고양이 C = 새로운 고양이를 작성하는 경우(); funtion을 c.Name()으로 호출하십시오. 그럼 컴파일 시간에 인식 되나요 ?? –

+0

가상 함수는 전체 계층 구조에 걸쳐 가상입니다. 따라서 파생 된 유형이 재정의 한 경우 (예 : BlackCat) c.Name에 여전히 일종의 조회가 포함됩니다. – GazTheDestroyer

+0

당신은 ** 가상 디스패치가 늦은 바인딩의 형태라고 말합니다 ** i-e 함수가 가상으로 정의 된 경우이 함수에 대한 호출이 런타임에 인식됩니까 ??? –

0

예, 가상 메소드에는 지연 바인딩이 필요합니다. 가즈을 http://blogs.msdn.com/b/ericlippert/archive/2012/02/06/what-is-quot-binding-quot-and-what-makes-it-late.aspx

+0

Guillaume : C#은 늦은 바인딩을 포함합니까 ?? 내가 stackoverflow에 대해서만 동적 및 반사 인터페이스를 제외하고 모든 일들은 C에서 초기 바인딩되어 있습니다 # 여기 링크 : [링크] http://stackoverflow.com/questions/484214/c-sharp-early-and-late -binding –

+1

"가상 디스패치는 후기 바인딩의 한 형태입니다"- C# 컴파일러 팀의 주요 개발자 인 Eric Lippert. – Guillaume