static void Main(string[] args) { Parent obj1 = new Parent(); Parent obj2 = new Child(); // Child obj2 = new Child(); // GrandChild obj3 = new GrandChild(); Parent obj3 = new GrandChild(); obj1.Name(); obj2.Name(); obj3.Name(); Console.WriteLine(); Parent[] Array = new Parent[] // new Parent[]에서 3개를 선언했으니 []안의 숫자를 생략해도 상관없다. { new Parent(), new Child(), new GrandChild() }; for (int i = 0; i < Array.Length; ++i) { Array[i].Name(); } // 배열을 만든 구문과 obj.Name()으로 선언한 구문의 결과값은 같다. // 만약 100개의 코드를 짠다고 가정해보자. // 배열코드는 배열 100개만 선언해주면 for문은 그대로 써도 상관이없지만, // obj.Name()코드는 1부터 100까지 객체선언도 해줘야하고 .Name()도 100개를 선언해줘야한다. // virtual을 안쓰면 참조변수의 타입기반으로 돌아간다. // 객체지향이기때문에 객체기반으로 돌릴꺼다. }
static void Main(string[] args) { Parent obj1 = new Parent(); Parent obj2 = new Child(); // Child obj2 = new Child(); // GrandChild obj3 = new GrandChild(); Parent obj3 = new GrandChild(); obj1.Name(); obj2.Name(); obj3.Name(); Console.WriteLine(); Parent[] Array = new Parent[] // new Parent[]에서 3개를 선언했으니 []안의 숫자를 생략해도 상관없다. { new Parent(), new Child(), new GrandChild() }; for (int i = 0; i < Array.Length; ++i) { Array[i].Name(); } //부모한테 Name(), 자식한테 Name()인 똑같은 메서드를 만들어서 사용하는 기법을 메서드 오버라이딩이라고한다. 라이딩을 라이트라고보고 덮어쓰는것을 생각해보자 //오버라이딩은 상속에서만 쓸 수 있다, 인자가 일치하는 경우 //오버로딩은 메서드이름은 똑같은데 인자가 다른것임. 생성자도 메서드이므로 생성자가 같은데 인자가 다르면 생성자 오버로딩이다. //오버로딩은 인자만 다르면 쓸 수 있으므로 상속했을때(클래스가 다를때), 같은 클래스일때도 쓸 수 있다. // //버츄얼을 쓰면 type을 체크하지않고 객체를 체크해서 객체에 맞춰서 호출된다. //일단은! 버츄얼은 좋다.라고 생각하자.. // }