가상키워드란? C# 관점으로 바로 뛰어들기 전에 객체 지향 프로그래밍 세계의 상속, 재정의 및 가상 키워드의 개념을 이해하거나 수정하는 것이 중요합니다.
메서드 재정의는 상속과 긴밀하게 연결된 OOP 개념입니다. 자식 클래스 메서드가 동일한 이름, 매개 변수 및 반환 유형을 가진 부모 클래스 메서드를 재정의하는 경우 이를 메서드 재정의라고 합니다. 가상 키워드는 파생 클래스에서 메소드가 재정의될 수 있음을 컴파일러에 표시합니다.
C# 관점에서 virtual 키워드는 파생 클래스에서 재정의를 허용하도록 속성, 메서드 또는 이벤트의 선언을 수정하는 데 사용됩니다. 간단히 말해서 virtual 키워드는 C#의 메서드 재정의 개념을 구현한 것입니다.
구문
기본 클래스에 virtual 키워드를 추가하고 파생 클래스에 override 키워드를 추가하면 모든 속성, 메서드 또는 이벤트를 재정의할 수 있습니다.
기본 클래스 선언에 virtual 키워드를 추가합니다.
public class Base { public virtual int abc { get; set; } // this property can be overridden public virtual void Xyz() { } // this method can be overridden }
기본 클래스 선언에 override 키워드를 추가하세요.
public class Derived : Base { public override int abc { get; set; } // this overrides the base class property public override void Xyz() { } // this overrides the base class method }
오버로딩과 재정의의 가장 기본적인 차이점은 전자는 컴파일 타임 메커니즘인 반면 후자는 런타임에 작동한다는 것입니다. 가상 키워드는 런타임에 실행되어 메소드 재정의 개념을 구현합니다.
가상 메서드나 속성이 호출되거나 액세스되면 컴파일러는 메서드나 속성의 재정의 멤버를 확인합니다. 발견되면 호출됩니다. 아무 것도 발견되지 않으면 원래 메서드나 속성이 호출됩니다.
여기서 훌륭한 질문이 생깁니다. 다중 수준 상속의 경우 어떻게 되나요? 글쎄요, 클래스 멤버가 둘 이상의 수준에서 재정의되면 가장 재정의된 멤버가 가장 많이 호출됩니다(가장 파생된 클래스에 있는 멤버).
C#의 가상 키워드에 대한 다음 예는 아래에 언급되어 있습니다
단일 하위 클래스가 상위 클래스를 상속할 때, 즉 다단계 상속이 없을 때 가상 키워드의 작동을 이해하기 위해 예를 들어 보겠습니다.
코드:
using System; public class Polynomial { public virtual double len { get; set; } public virtual double wid { get; set; } public virtual double Area() { return len * wid; } } public class Rectangle: Polynomial { } public class Square : Polynomial { public override double len { get; set; } public override double Area() { return len * len; } } public class Circle : Polynomial { public double radius { get; set; } public override double Area() { return Math.PI * radius * radius; } } public class Triangle : Polynomial { public override double Area() { return 0.5 * len * wid; } } public class Program { public static void Main() { var rect = new Rectangle(); rect.len = 5; rect.wid = 10; Console.WriteLine("Area of Rectangle = " + rect.Area()); var sq = new Square(); sq.len = 15; Console.WriteLine("Area of Square = " + sq.Area()); var cir = new Circle(); cir.radius = 10; Console.WriteLine("Area of Circle = " + cir.Area()); var tri = new Triangle(); tri.len = 5; tri.wid = 10; Console.WriteLine("Area of Triangle = " + tri.Area()); } }
출력:
기본 클래스 Polynomial에서는 두 개의 속성과 하나의 메서드를 가상으로 선언했습니다. 이제 하위 클래스에서 이를 재정의할 수 있습니다. 이제 다항식 클래스를 상속받아 다양한 모양의 다양한 하위 클래스를 만듭니다.
Rectangle 클래스에서는 속성이나 메서드를 재정의할 필요가 없습니다. 기본 클래스 구현은 Rectangle 클래스에 대해 있는 그대로 작동합니다.
Square 클래스에는 width 속성이 없습니다. 따라서 길이 속성과 Area 메서드를 재정의하여 길이의 제곱을 반환합니다.
Circle 클래스에는 길이나 너비가 없습니다. 따라서 새로운 클래스별 Radius 속성을 선언하고 이에 따라 Area 메서드를 재정의합니다.
Triangle 클래스에서는 단순히 Area 메서드를 재정의하고 속성은 기본 클래스 Polynomial에서 상속됩니다.
파생 클래스의 객체를 생성할 때 컴파일러는 기본 클래스 생성 중에 virtual 키워드를 발견하여 재정의된 멤버를 찾습니다. 그러면 재정의된 멤버가 그에 따라 호출됩니다.
다단계 상속을 포함하도록 위의 예를 수정해 보겠습니다.
코드:
using System; public class Polynomial { public virtual double len { get; set; } public virtual double wid { get; set; } public virtual double Area() { return 0; } } public class Rectangle : Polynomial { public override double Area() { return len * wid; } } public class Square : Rectangle { public override double len { get; set; } public override double Area() { return len * len; } } public class Program { public static void Main() { var rect = new Rectangle(); rect.len = 5; rect.wid = 10; Console.WriteLine("Area of Rectangle = " + rect.Area()); var sq = new Square(); sq.len = 15; Console.WriteLine("Area of Square = " + sq.Area()); } }
출력:
가상 멤버에는 기본 클래스와 파생 클래스 모두에 선언과 정의가 있습니다. 파생 클래스에 일부 추가 기능이 필요할 때 가상 멤버가 유리합니다. 추가 기능으로 사용됩니다.
이 글에서는 C#의 가상 개념을 이해했습니다. C#이 런타임 중에 virtual 키워드를 구현하는 방법과 예제를 살펴보았습니다.
가상 멤버는 객체 지향 프로그래밍의 훌륭한 개념입니다. 그러나 심층적인 지식을 얻으려면 추상 키워드, 인터페이스 및 새로운 키워드에 대해 학습하는 것이 좋습니다. 이것은 그들 모두의 차이점을 이해하는 데 큰 도움이 될 것입니다. 이는 가상을 사용해야 할 때와 사용하지 말아야 할 때를 파악하는 데 도움이 됩니다.
위 내용은 C#의 가상 키워드 의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!