2013-04-02 2 views
0
namespace test 
{ 
    class testclass1 
    { 

     public virtual void test() 
     { 
      Console.WriteLine("Parent class"); 
     } 
    } 
} 

namespace test 
{ 
    class Program : testclass1 
    { 
     public override void test() 
     { 
      Console.WriteLine("Child class"); 
     } 
     static void Main(string[] args) 
     { 
      Program t = new Program(); 
      t.test(); 
      Console.ReadLine(); 
     } 
    } 
} 

사용 대답은 "어린이 클래스"이며 testclass1 t = new Program() 답변은 동일합니다!이 두 가지의 차이점은 무엇입니까?

이렇게 두 초기화 간의 정확한 차이점은 무엇입니까?

+8

가상 메소드의 작동 방식에 대해 얼마나 알고 있습니까? 변수의 컴파일 타임 타입을 변경해도 가상 메소드에 어떤 구현이 선택되는지에 영향을 미치지는 않습니다. 선택할 방법이 여러 가지 일 때 * overload *가 선택되는 데 영향을 미치지 만, –

답변

2

당신은 파생 클래스와 기본 메서드를 재정의하기 때문에 그래서 항상 방법의 Program의 구현을 호출합니다 tProgram하지 TestClass의 인스턴스를 할당한다.

public class Base 
{ 
    //I am virtual, this means that I can be overriden 
    public virtual void MethodA() 
    { 
    Console.WriteLine("Hello, From Base"); 
    } 
} 
public class Derived : Base 
{ 
    //I am Base, but with other stuff. 

    //I am going to do something else with MethodA 
    public override void MethodA() 
    { 
    Console.WriteLine("Hello, From Derived"); 
    } 
} 

본질적으로 수행하고 있습니다.

Base o = new Dervied(); 

Derived

은 기본이지만, 그렇게 Derived의 구현은 여전히 ​​서 Derived Base까지 변경할 수 없습니다.

+0

고맙습니다. 도움이됩니다. – User1

0

여기서 사용하는 것을 inheritance이라고합니다. 귀하의 경우 Program 클래스는 testclass1에서 상속됩니다. 상속은 is-a 관계를 설명합니다. 당신은 사람이고, Program은 -Atestclass1입니다.

이 때문에 testclass1 t = new Program()라고 할 수 있습니다. testclass1 유형의 변수를 작성하고 testclass1의 특수 유형인 Program으로 초기화하십시오.

상속을 사용할 수있는 기능 중 하나는 동작을 확장하거나 대체하는 것입니다. testclass1 클래스의 virtual 키워드는 Program 클래스의 override 키워드로 수행하는 것과 같은 방법으로 바꿀 수 있음을 의미합니다.

Program p = new Program(); 
testclass1 t = new testclass1(); 
t.test(); 
p.test(); 

이 인쇄됩니다 : 그것은`testclass1 인 것처럼

Child class 
Parent class 

당신은 그러나 당신의 Program 클래스를 사용할 수 있습니다, 당신이 할 수있는 것처럼

다음 라인은 다른 결과를 줄 것이다 동물처럼 취급받는 사람이나 개처럼 취급합니다.

관련 문제