이번에는 책에도 많이 나오고 다들 알고는 있지만 잘 쓰지 않아서 가끔 실전에서 생각이 나지 않을 법한 것을 적어보겠습니다.
메서드를 숨긴다? 무슨 말일까요?
일단! 객체지향 언어인 C#에서 클래스를 상속할 수 있다는 것은 다들 아시죠?
Form 클래스를 예로 들면..
이런 식으로 상속할 수 있습니다.
이 경우 Form 클래스에 정의된 다양한 메서드를 사용할 수 있죠.
new NewForm().Show(); <-이렇게 내가 정의하지 않은 Show()메서드를 사용할 수 있습니다.
ToString() 메서드도 그냥 사용할 수 있지만.. 뭔가 바꿔보고싶네요.. 그럴 때는 Override를 쓰면 됩니다.
public override string ToString() { return "야호!"; }
이렇게 Override(재정의)를 하면 내가 원하는대로 메서드를 바꿀 수 있습니다.
그런데 문제가 있네요.. Show()나 Hide()같은 메서드 몇 개는 Override가 안됩니다 ㅡㅡ;
아마 sealed 되어 있거나 virtual이 아닌 모양입니다.
뭐~ 여러가지 규칙들이 참 많기도 하군요!
이럴 땐 new 키워드를 이용해서 상위 클래스의 메서드를 숨길 수 있습니다.
메서드를 숨긴다? 무슨 말일까요?
일단! 객체지향 언어인 C#에서 클래스를 상속할 수 있다는 것은 다들 아시죠?
Form 클래스를 예로 들면..
public class NewForm : System.Windows.Forms.Form
{
}
{
}
이런 식으로 상속할 수 있습니다.
이 경우 Form 클래스에 정의된 다양한 메서드를 사용할 수 있죠.
new NewForm().Show(); <-이렇게 내가 정의하지 않은 Show()메서드를 사용할 수 있습니다.
ToString() 메서드도 그냥 사용할 수 있지만.. 뭔가 바꿔보고싶네요.. 그럴 때는 Override를 쓰면 됩니다.
public override string ToString() { return "야호!"; }
이렇게 Override(재정의)를 하면 내가 원하는대로 메서드를 바꿀 수 있습니다.
그런데 문제가 있네요.. Show()나 Hide()같은 메서드 몇 개는 Override가 안됩니다 ㅡㅡ;
아마 sealed 되어 있거나 virtual이 아닌 모양입니다.
virtual 키워드가 적혀있지 않으면 재정의가 안됩니다.
virtual이 적혀서 상속한 메서드를 sealed override 키워드로 재정의 하는 경우에도 하위 클래스에서 사용할 수 없습니다.
virtual이 적혀서 상속한 메서드를 sealed override 키워드로 재정의 하는 경우에도 하위 클래스에서 사용할 수 없습니다.
뭐~ 여러가지 규칙들이 참 많기도 하군요!
이럴 땐 new 키워드를 이용해서 상위 클래스의 메서드를 숨길 수 있습니다.
public new void Show()
{
내가 원하는 내용
base.Show();
}
이렇게 적으면 Show()메서드를 내 마음대로 꾸밀 수 있겠죠?
Java도 이와 개념이 비슷합니다만, 약간의 차이가 있습니다. sealed와 virtual 같은 것에서요~ 책에보면 자세히 나와있을 거예요 아마 ^^