부모로부터 상속받은 함수가 자신의 목적에 맞지 않을 경우 자식 클래스가 함수를 재정의 할수있다
부모와 자식 클래스는 다음 두개의 지정자를 함수 앞에 붙여 재정의되는 함수라는 것을 표시한다
virtual
- 부모 클래스의 함수 앞에 붙이며 자식 클래스에 의해 재정의될 수 있다는 뜻이다
override
- 자식 클래스의 함수 앞에 붙이며 부모로부터 상속받은 함수와는 다르게 구현한다는 뜻이다
부모가 재정의를 허가해야만 자식이 재정의를 할 수 있으므로 이 두 지정자는 보통 짝을 이루며 사용된다
- 부모 클래스에 virtual 을 뺴고, 자식 클래스에 override 를 new로 바꾸면 Message는 비가상 메소드가 된다
- 객체가 선언된 타입을 정적 타입
- 실제 가리키고 있는 타입을 동적 타입
- B2의 정적 타입은 Base, 동적 타입은 Derived
Base B2 = D
여기서 Base 타입을 따르면 비가상 함수
여기서 D 타입을 따르면 가상 함수
비가상 메소드 - 항상 호출 객체의 타입, 정적 타입을 따른다
- Message가 비가상일때는 B2가 Base로 선언되었으므로 Base의 메소드가 호출
가상 메소드 - 호출 객체가 실제로 가리키고 있는 아팁, 동적 타입을 따른다
- Message가 가상일때는 B2가 Base타입이지만 Derived 객체를 가리키고 있으므로 Derived의 메소드가 호출
부모와 자식 클래스는 다음 두개의 지정자를 함수 앞에 붙여 재정의되는 함수라는 것을 표시한다
virtual
- 부모 클래스의 함수 앞에 붙이며 자식 클래스에 의해 재정의될 수 있다는 뜻이다
override
- 자식 클래스의 함수 앞에 붙이며 부모로부터 상속받은 함수와는 다르게 구현한다는 뜻이다
부모가 재정의를 허가해야만 자식이 재정의를 할 수 있으므로 이 두 지정자는 보통 짝을 이루며 사용된다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | using System; namespace @override { class Base { public virtual void Message() { Console.WriteLine( "Base Meassage" ); } } class Derived : Base { public override void Message() { Console.WriteLine( "Derived Megssage" ); } } class Program { static void Main(string[] args) { Base B = new Base(); Derived D = new Derived(); B.Message(); D.Message(); Base B2 = D; B2.Message(); } } } |
- 부모 클래스에 virtual 을 뺴고, 자식 클래스에 override 를 new로 바꾸면 Message는 비가상 메소드가 된다
- 객체가 선언된 타입을 정적 타입
- 실제 가리키고 있는 타입을 동적 타입
- B2의 정적 타입은 Base, 동적 타입은 Derived
Base B2 = D
여기서 Base 타입을 따르면 비가상 함수
여기서 D 타입을 따르면 가상 함수
비가상 메소드 - 항상 호출 객체의 타입, 정적 타입을 따른다
- Message가 비가상일때는 B2가 Base로 선언되었으므로 Base의 메소드가 호출
가상 메소드 - 호출 객체가 실제로 가리키고 있는 아팁, 동적 타입을 따른다
- Message가 가상일때는 B2가 Base타입이지만 Derived 객체를 가리키고 있으므로 Derived의 메소드가 호출
'Study > C#' 카테고리의 다른 글
C# 클래스 상속 - 3. 추상 클래스 (0) | 2012.01.03 |
---|---|
C# 클래스 상속 - 2. 재정의 (다형성) (0) | 2011.12.29 |
C# 클래스 상속 - 2. 재정의 (멤버 숨기기) (0) | 2011.12.29 |
C# 클래스 상속 - 1. 안전한 형변환 (0) | 2011.12.29 |
C# 클래스 상속 - 1. 상속의 원칙 (0) | 2011.12.28 |