effective C# ITEM #20 "interface의 구현과 virtual 메소드의 overriding 을 구분하라" 를 보고 정리.
C# 과 C++에선 그렇지 않다.
C#에서는 Parent 의 method를 virtual 로 선언하면 그것을 override 하는 Child 에서는 반드시 override keyword 를 써줘야 한다.
2.Interface에 있는 method 선언은 virtual 이 아니다. virtual과 무관하다. Interface는 클래스가 해야할 일을 명시하는 일종의 계약일 뿐이다.
만약 Parent 에서 IEx 를 구현하였고(여기에는 Msg() 가 있다고 하자)
Child 에서 Parent 를 상속받았고 Msg()를 override 했을 때
Parent의 ref. 변수로 Child의 객체를 가리키고 있더라도 이 ref. 변수로 Msg()를 call 하면 Child 가 아닌 Parent의 Msg() 가 call 된다.
이를 해결하려면
1.Parent의 Msg() 를 virtual 로 변경
2.Parent 를 수정할 수 없는 경우, Child 에서 IEx 를 상속받아 Msg() 를 override
즉 이런 형태가 된다.
class Parent : IEx { ... }
class Child : Parent { ... }
class Child : Parent { ... }
였던 것을 아래와 같이 수정
class Parent : IEx { ... }
class Child : Parent,IEx { ... }
virtual method가 아닌 method를 override 할 경우에는 new 키워드를 써줘야 한다.
(C# 이전 버젼에서는 new 를 쓰지 않으면 에러로 처리되었으나 3.0 이상에서는 warning 만 발생하는 듯 하다)
'C#, .NET' 카테고리의 다른 글
Window Message 를 직접 처리하기 (0) | 2011.06.17 |
---|---|
정밀하게 시간측정 하기. (0) | 2011.06.17 |
atoi ,itoa (0) | 2011.06.17 |
다차원 배열. jagged array (0) | 2011.06.17 |
C++, C#, Java의 문자열 비교 (0) | 2011.06.17 |