2014년 2월 19일 수요일

22. [C#,오엔제이닷넷강좌]C# virtual 한정자 virtual, 가상함수,메서드, C#/ASP.NET/ADO닷넷/닷넷교육/닷넷강좌학원/닷넷공부/닷넷책/닷넷객체지향교육 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()); } } [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecCsharp&wr_id=149 자바 오라클/빅데이터 아이폰/안드로이드 닷넷/WPF 표준웹/HTML5 채용/취업무료교육 초보자코스 [기업100%환급]Spring ,MyBatis,Hibernate실무과정 총 5일 40시간 02-24 [기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 총 5일 40시간 03-03 Spring3.X, MyBatis, Hibernate실무과정 총 12일 36시간 03-03 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 총 24일 72시간 03-14 [주말저녁]자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트 총 18일 72시간 02-22 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 총 10일 70시간 03-01 Spring3.X, MyBatis, Hibernate실무과정 총 5일 35시간 03-09 [기업100%환급]SQL기초에서 Schema Object까지 총 5일 40시간 02-24 [기업100%환급]PL/SQL,ORACLE HINT,TUNING 총 5일 40시간 03-03 SQL초보에서실전전문가까지 총 18일 54시간 03-10 SQL초보에서실전전문가까지 총 8일 56시간 03-01 [주말저녁]SQL기초에서 Schema Object까지 총 10일 40시간 03-01 iPhone 하이브리드 앱 개발 실무과정 총 14일 42시간 02-25 안드로이드개발자과정 총 14일 42시간 03-07 안드로이드개발자과정 총 6일 42시간 02-22 C#4.0, ADO.NET, Network 프로그래밍 총 5일 35시간 02-24 C#,ASP.NET마스터 총 18일 54시간 03-03 닷넷실무자를위한WPF개발자과정 총 8일 56시간 02-29 C#,ASP.NET마스터 총 8일 56시간 03-09

22. [C#,오엔제이닷넷강좌]C# virtual 한정자  virtual, 가상함수,메서드, C#/ASP.NET/ADO닷넷/닷넷교육/닷넷강좌학원/닷넷공부/닷넷책/닷넷객체지향교육

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());
        }
    }
    
 
 

C#4.0, ADO.NET, Network 프로그래밍 5일 35시간   02-24
C#,ASP.NET마스터 18일 54시간   03-03
닷넷실무자를위한WPF개발자과정 8일 56시간   02-29
C#,ASP.NET마스터 8일 56시간   03-09

댓글 없음:

댓글 쓰기