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
using System;
 
namespace HideMethod
{
    class Base
    {
        public void Message()
        {
            Console.WriteLine("Base Message");
        }
    }
 
    class Derived : Base // 제거해도 컴파일에는 문제가 없다, 제거하면 부모메소드 호출
    {
        public void Message()
        {
            Console.WriteLine("Derived Message");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Base B = new Base();
            Derived D = new Derived();
 
            B.Message();
            D.Message();
        }
    }
}





- 부모 클래스의 멤버와 같은 이름으로 메소드를 정의하면 부모의 메소드는 숨겨진다
- 부모의 메소드를 숨기는 것이 의도된 것이라면 상관 없지만, 우연히 같은 메소드라면 문제가 될수도 있다
- 미리 정의해 놓은 부모클래스가 뜻하지않게 가려지므로 원하는대로 동작하지 않을수도 있다
- 이게 정말 의도된 것이고 별 문제가 없다면 새로 정의하는 메소드에 new 지정자를 붙여야 한다
ex) public new void Message()
   * new 지정자는 상속받은 멤버를 완전히 숨겨 버리고 자식 클래스가 같은 이름으로 새로운 멤버를 만든다는 뜻이다
- new 지정자는 부모의 멤버를 숨기기만 하는 것이지 아예 상속을 받지 않겠다는 뜻은 아니다, 여전히 상속된다
- 부모의 숨겨진 멤버를 참조하고자 할때는 base를 사용한다

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
using System;
 
namespace HideField
{
    class Base
    {
        public int a;
    }
 
    class Derived : Base
    {
        public new double a;
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Base B = new Base();
            Derived D = new Derived();
 
            B.a = 1234;
            D.a = 5.678;
 
            Console.WriteLine(B.a);
            Console.WriteLine(D.a);
        }
    }
}


Posted by 코딩하는 야구쟁이
,