C #에서 가상 및 추상 메서드 탐색

C # 프로그래밍 언어는 가상 및 추상 메서드에 대한 지원을 제공하며 각 메서드에는 고유 한 이점이 있습니다. 가상 메서드를 사용하여 후기 바인딩을 구현하는 반면 추상 메서드를 사용하면 형식의 하위 클래스에서 메서드를 명시 적으로 재정의 할 수 있습니다. 이 게시물에서는 가상 및 추상 방법과 사용시기에 대해 설명합니다.

가상 메서드는 기본 클래스에서 가상으로 선언 된 메서드입니다. 메서드는 메서드 서명에 "virtual"키워드를 지정하여 가상으로 선언됩니다. 가상 메서드에는 반환 유형이있을 수도 있고 없을 수도 있습니다. 가상 메서드를 사용하면 유형의 하위 클래스가 메서드를 재정의 할 수 있습니다. 런타임 다형성 또는 후기 바인딩을 구현하는 데 사용됩니다. 클래스의 가상 또는 추상 멤버는 private으로 선언 할 수 없습니다. 또한 가상 메소드에 구현을 가질 수 있습니다. 즉, 가상 메소드에 구현이있을 수 있습니다. 이러한 구현은 가상 메서드가 정의 된 유형의 하위 클래스에 의해 재정의 될 수 있습니다.

MSDN은 "가상 키워드는 메서드, 속성, 인덱서 또는 이벤트 선언을 수정하는 데 사용되며 파생 클래스에서 재정의 될 수 있도록합니다."

이제 가상 메서드가 어떻게 사용되는지 더 명확하게하기 위해 몇 가지 코드를 살펴 보겠습니다. 아래 코드 스 니펫을 참조하십시오.

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

Test () 메서드는 Base 클래스에서 가상으로 선언되고 Derived 클래스에서 재정의됩니다. 가상 키워드를 사용하여 Base 클래스에서 가상으로 메서드를 선언하는 방법에 유의하십시오. Derived 클래스에서 가상 메서드를 재정의 할 때는 virtual 키워드가 필요하지 않습니다.

이제 가상 메서드가 호출되는 방법을 보여주는 다음 코드 조각을 참조하십시오.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Base 클래스의 두 인스턴스 (baseObj1 및 baseObj2)가 생성됩니다. 첫 번째 경우 baseObj1이라는 참조 개체는 Base 클래스의 인스턴스를 참조합니다. 두 번째 경우 baseObj2라는 참조 개체는 Derived 클래스의 인스턴스를 참조합니다. 코드를 실행할 때 가상 메서드에 대한 첫 번째 호출은 콘솔에 "This is the base version of the virtual method"라는 메시지를 표시합니다. 두 번째 경우 "이것은 가상 메서드의 파생 된 버전입니다"라는 메시지가 표시됩니다. 왜 이런 차이가 있습니까?

첫 번째 경우에는 참조 객체 baseObj1의 유형이 고려됩니다. Base 유형이므로 가상 메서드의 기본 버전이 호출됩니다. 두 번째 경우에는 참조 객체 baseObj2의 컨텍스트가 고려되어 결과가됩니다.

추상 메서드는 기본 클래스에서 추상으로 선언되고 구현을 가질 수 없습니다. 즉, 기능을 가질 수 없습니다. 추상 메서드가 정의 된 유형의 파생 클래스에서 메서드를 강제로 재정의하려는 경우 추상 메서드를 사용할 수 있습니다. 이것은 컴파일러에 의해 컴파일 타임에 시행됩니다. 따라서 기본 클래스에서 추상 수정자를 사용하여 메서드를 추상으로 선언 한 경우이 클래스의 하위 클래스는 추상 메서드를 구현해야하며 컴파일러는 파생 클래스가 추상을 구현하지 않았다는 오류를 표시합니다. 회원. 본질적으로,추상 메서드는 추상 기본 클래스에서 추상 키워드를 사용하여 선언되며이 유형의 비추 상 하위 클래스에는 추상 메서드의 자체 구현이 있어야합니다. 추상 메서드는 본질적으로 암시 적으로 가상이지만 추상 메서드를 선언 할 때 virtual 키워드를 사용할 수 없습니다. 추상 메서드는 추상 클래스 내에서만 선언 할 수 있습니다.

추상 메서드의 일반적인 용도는 ToString () 또는 Equals () 메서드를 강제로 재정의하는 것입니다. 다음 코드 조각은 EntityBase라는 추상 클래스에서 추상 메서드가 선언되는 방법을 보여줍니다.

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

EntityBase 클래스는 모든 엔터티의 기본 유형입니다. Customer 엔터티 클래스는이 클래스를 확장하고 추상 메서드에 대한 구현을 제공합니다. 본질적으로 모든 엔티티 클래스는 ToString () 및 Equals () 메서드의 자체 구현을 제공합니다. 이러한 메서드에 대한 기본 구현은 기본 클래스에 필요하지 않으므로 추상으로 표시됩니다. 따라서 메서드 재정의는 EntityBase라는 기본 클래스에서 메서드를 추상으로 선언하여 적용됩니다.