22. [C#,닷넷강좌]C# virtual 한정자 virtual, 가상함수,메서드
virtual 키워드는 메서드, 속성, 인덱서 또는 이벤트 선언을 한정하는 데 사용되며 파생 클래스에서 재정의될 수 있다. 아래 메서드는 이 메서드를 상속하는 클래스에 의해 재정의될 수 있다.
public virtual double perimeter()
{
return x * y;
}
가상 메서드가 호출되면 재정의 함수에 대해 개체의 런타임 형식이 검사됩니다. 가장 많이 파생되는 클래스의 재정의 멤버가 호출되므로 멤버를 재정의한 파생 클래스가 없을 경우에는 원래 멤버가 호출될 수도 있다.
virtual 한정자는 static, abstract, private 또는 override 한정자와 함께 사용할 수 없으며 일반 메소드는 비 가상 메서드이며 재정의할 수 없다. 또한 추상 함수(abstract method)는 virtual 키워드를 사용하지 않지만 자동으로 virtual이 된다.
아래는 가상 속성의 예이다.
가상 속성은 추상 메서드와 비슷하게 작동하지만 선언 및 호출 구문에 차이가 있다.
- 정적 속성에는 virtual 한정자를 사용할 수 없다.
- 상속된 가상 속성은 override 한정자를 사용하는 속성 선언을 포함하는 방법을 통해 파생 클래스에서 재정의될 수 있다.
class MyBaseClass
{
// virtual auto-implemented property. Overrides can only
// provide specialized behavior if they implement get and set accessors.
public virtual string Name { get; set; }
// ordinary virtual property with backing field
private int num;
public virtual int Number
{
get { return num; }
set { num = value; }
}
}
class MyDerivedClass : MyBaseClass
{
private string name;
// Override auto-implemented property with ordinary property
// to provide specialized accessor behavior.
public override string Name
{
get
{
return name;
}
set
{
if (value != String.Empty)
{
name = value;
}
else
{
name = "Unknown";
}
}
}
}
[아래 예제를 실습하자.]
class TestClass
{
public class Shape
{
public const double PI = Math.PI;
protected double x, y;
public Shape()
{
}
public Shape(double x, double y)
{
this.x = x;
this.y = y;
}
public virtual double Area()
{
return x * y;
}
}
public class Circle : Shape
{
public Circle(double r) : base(r, 0)
{
}
public override double Area()
{
return PI * x * x;
}
}
class Sphere : Shape
{
public Sphere(double r) : base(r, 0)
{
}
public override double Area()
{
return 4 * PI * x * x;
}
}
class Cylinder : Shape
{
public Cylinder(double r, double h) : base(r, h)
{
}
public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}
}
static void Main()
{
double r = 3.0, h = 5.0;
Shape c = new Circle(r);
Shape s = new Sphere(r);
Shape l = new Cylinder(r, h);
// Display results:
Console.WriteLine("Area of Circle = {0:F2}", c.Area());
Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
}
}
기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 2244 | ||
[채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1614 | ||
53 | [평일주간100%환급]Spring,JAVA,JSP,안드로이드,C#닷넷,SQL,튜닝… | 03-15 | 1406 | |
52 | [주말]C#,ASP.NET마스터 | 01-31 | 1520 | |
51 | [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… | 01-31 | 1754 | |
50 | [기업100%환급]개발자를위한스프링,마이바티스,하이버네이트(스… | 01-31 | 1216 | |
49 | [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 | 01-19 | 1508 | |
48 | [평일주간,평일야간,주말]안드로이드개발자과정 | 01-11 | 1341 | |
47 | [평일야간,주말주간,주말야간]JAVA,Network&JSP&Spring,MyBatis,… | 01-03 | 1872 | |
46 | 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 2244 | |
45 | [기업100%환급]자바웹개발기초과정(JAVA,JDBC,JSP,Servlet,Aajx,… | 12-19 | 1615 | |
44 | [평일주간야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX… | 12-14 | 1586 | |
43 | [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1614 | |
42 | [주말주간]자바&웹,jQUERY,스프링프레임워크 | 12-09 | 1287 | |
41 | [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 | 12-01 | 1509 | |
40 | [기업100%환급]자바기초&안드로이드개발자과정(Android전액환급… | 12-01 | 1683 | |
39 | [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) | 12-01 | 1158 |
댓글 없음:
댓글 쓰기