C\#하위 클래스 가 기본 클래스 방법 에 대한 계승,재 작성 과 숨 김 에 대한 상세 한 설명

머리말
자 류,기 류,방법 으로 이런 개념 을 계승 하 는 것 은 모두 가 잘 알 고 있 을 것 이다.결국 OOP 를 지원 하 는 언어 로 서 하위 클래스,기본 클래스 를 파악 하 는 것 은 C\#를 배 우 는 기초 이다.하지만 이런 개념 들 은 간단 하지만 초보 자 들 이 만 날 수 있 는 구덩이 도 있 으 니 함께 살 펴 보 자.
하위 상속 기본 클래스 비 사유 방법
우선 우 리 는 가장 간단 한 하 나 를 본다.자 류 는 기 류 를 계승 하지만 자 류 는 계승 하 는 방법 에 대해 아무런 변화 가 없다.

class Person
{
 public void Greeting()
 {
 Console.WriteLine("Hello, I am Person");
 }
}

class Employee : Person
{

}

class Program
{
 static void Main(string[] args)
 {
 Person p = new Employee();
 p.Greeting();
 }
}
이 예 에서 하위 클래스 인 Employee 는 기본 클래스 의 Greeting 방법 을 자동 으로 계승 하고 하위 클래스 인 스 턴 스 에서 이 방법 을 호출 할 때 실제 적 으로 기본 클래스 의 방법 을 호출 합 니 다.이 예 는 매우 간단 하 니 더 말 할 필요 가 없다. 
하위 클래스 덮어 쓰기 기본 클래스 방법
다음은 가장 흔히 볼 수 있 는 상황 이다.하위 클래스 가 기본 클래스 를 덮어 쓰 는 방법 은 전형 적 인 예 는 다음 과 같다.

class Person
{
 public virtual void Greeting()
 {
 Console.WriteLine("Hello, I am Person");
 }
}

class Employee : Person
{
 public override void Greeting()
 {
 Console.WriteLine("Hello, I am Employee");
 }
}

class Program
{
	static void Main(string[] args)
	{
		Employee e = new Employee();
		Person p = e;
		p.Greeting();
		e.Greeting();
	}
}
마찬가지 로 이 코드 도 간단 합 니 다.기본 적 인 방법 은 키워드 virtual 표현 방법 을 통 해 덮어 쓸 수 있 습 니 다.하위 클래스 는 키워드 override 를 통 해 기본 적 인 방법 에 대한 덮어 쓰 기 를 실현 합 니 다.마지막 으로 호출 부분 을 보면 변수 유형 이 하위 클래스 든 기본 클래스 든 대상 의 실제 유형 이 하위 클래스 라면 호출 방법 은 모두 하위 클래스 로 덮어 쓰 는 방법 입 니 다.이것 도 다 중 적 인 실현 기반 입 니 다. 
하위 클래스 숨 김 기본 클래스 방법
위의 두 가지 예 는 모두 매우 간단 하고 논리 도 분명 하 며 약간 은 산 자 류 가 기본 적 인 방법 을 숨 기 는 상황 이다.
하위 클래스 숨 김 기본 클래스 의 비 가상 방법
기본 이불 류 계승 방법 은 가상 방법 일 수도 있 고 비 가상 방법 일 수도 있 습 니 다.먼저 비 가상 방법 이불 류 가 숨겨 진 상황 을 보고 기본 방법 을 숨 기 는 키 워드 는 new 입 니 다.

class Person
{
 public void Greeting()
 {
 Console.WriteLine("Hello, I am Person");
 }
}

class Employee : Person
{
 public new void Greeting()
 {
 Console.WriteLine("Hello, I am Employee");
 }
}

class Program
{
 static void Main(string[] args)
 {
 Employee e = new Employee();
 Person p = e;
 p.Greeting();
 e.Greeting();
 }
}

여기 서 의 결 과 는 일부 초보 자 들 의 예상 을 벗 어 날 수 있 습 니 다.왜 하위 클래스 Employee 의 인 스 턴 스 인 데 서로 다른 인용 변수 유형 에서 다른 효 과 를 보 였 습 니까?왜 기본 클래스 에 호출 된 방법 입 니까?
사실 이것 은 C\#의 함수 호출 메커니즘 과 관련 이 있다.일반적으로 C\#를 MSIL 로 컴 파일 한 후에 두 가지 함수 호출 방식 이 있다.
  • Call 은 비 허 적 인 방식 으로 방법 을 호출 합 니 다.보통 정적 함수 호출 에 사 용 됩 니 다.정적 함수 가 허 적 일 수 없 지만 비 허 적 인 방식 으로 허 적 인 방법
  • 을 호출 할 수 있 습 니 다.
  • Callvirt 는 가상 방식 으로 호출 되 며,일반적으로 비 정적 방법 과 가상 방법 으로 호출 된다.호출 방법 이 거짓 이 아니라면 변수 형식 을 참조 하여 최종 호출 방법 을 결정 합 니 다.반대로 호출 하 는 방법 이 허 라면 실례 변수 유형 이 최종 호출 하 는 방법 을 결정 합 니 다.즉,다시 쓰 는 방법 이 나타 날 수 있 기 때 문 입 니 다.즉,다 태
  • ILDASM 으로 저희 프로그램 집합 을 열 어 보 세 요.

    여기 서 사용 하 는 Callvirt 가 확실 하 다 는 것 을 증명 하 였 으 며,이 방법 은 비 허 적 인 방법 이기 때문에 두 번 의 호출 에서 변수 유형 인 Person 과 Employee 를 참조 하면 호출 하 는 방법 을 결정 할 수 있 습 니 다.두 가지 유형 은 각각 자신의 Greeting 방법 을 실 현 했 고 하위 클래스 를 덮어 쓰 는 기본 적 인 방법 은 나타 나 지 않 았 다.두 번 의 호출 결과 가 왜 다른 지 설명 한다.마지막 으로 가장 복잡 한 상황 을 살 펴 보 겠 습 니 다. 
    하위 클래스 숨 김 기본 클래스 의 가상 방법
    아래 코드 를 고려 하 다
    
    class Person
    {
     public virtual void Greeting()
     {
      Console.WriteLine("Hello, I am Person");
     }
    }
    
    class Employee : Person
    {
     public new virtual void Greeting()
     {
      Console.WriteLine("Hello, I am Employee");
     }
    }
    
    class Manager : Employee
    {
     public override void Greeting()
     {
      Console.WriteLine("Hello, I am Manager");
     }
    }
    
    class Program
    {
     static void Main(string[] args)
     {
      Manager m = new Manager();
      Person p = m;
      Employee e = m;
      p.Greeting();
      e.Greeting();
      m.Greeting();
     }
    }
    출력 이 뭘 까요?이것 도 호 씨 가 일찍이 만 났 던 필기시험 문제 로 겉 으로 는 간단 해 보이 지만,주의 하지 않 아 도 빠 질 수 있다.
    1,2,3.정 답 발표.

    좀 의외 지 않 습 니까?분석 해 보 겠 습 니 다.

    우선,세 번 의 호출 은 모두 callvirt 이 고 방법 Greeting 은 가상 방법 입 니 다.우 리 는 대상 의 인 스 턴 스 를 고려 하여 호출 할 방법 을 결정 해 야 합 니 다.
  • 첫 번 째 호출 에서 인용 변수 유형 은 Person 입 니 다.대상 인 스 턴 스 유형 인 Manger 는 Greeting 방법 을 다시 썼 지만 Manger 기본 클래스 인 Emplyee 를 계승 하 는 Greeting 방법 을 다시 썼 습 니 다.Person 에서 Greeting 방법 은 하위 클래스 Manger 에서 숨 겨 졌 을 뿐 다시 쓰 지 않 았 기 때문에 Person 의 Greeting
  • 을 호출 했 습 니 다.
  • 두 번 째 호출 에서 인용 변수 유형 은 Employee 이 고 Employee 의 Greeting 방법 은 Manager 에 의 해 재 작성 되 었 기 때문에 이번 호출 은 Manager 의 Greeting
  • 입 니 다.
  • 마지막 호출 은 두말 할 필요 도 없고 간단 한 재 작성 사례 일 뿐이다
  • 어 때,동료 들 이 결 과 를 잘못 맞 힌 거 아니 야? 
    총결산
    하위 클래스 가 기본 클래스 에 대해 계승,재 작성,숨 기 는 방법 이 있 는 상황 에서 구체 적 으로 어떤 방법 이 호출 되 는 지 판단 하 는 것 이 어렵 지만 다음 과 같은 요점 을 기억 하 세 요.
    호출 된 방법 이 가상 이 아니라면 인용 변수 유형 에 만 관심 을 가 져 야 합 니 다.인용 변수 유형 은 호출 방법 이 어디 에 있 는 지 결정 할 수 있 습 니 다.호출 방법 이 가상 이 라면 인용 변수 유형의 측면 에서 이 방법 이 대상 유형 에 의 해 재 작성 되 었 는 지 확인 해 야 합 니 다.만약 그렇다면 대상 형식의 재 작성 방법 을 호출 합 니 다.반대로 인용 변수 형식 에 호출 방법 을 다시 결정 하도록 합 니 다.
    이렇게 하면 우 리 는 하위 클래스 가 기본 적 인 방법 을 숨 기 는 상황 을 다시 만나면 상기 요점 을 응용 하면 구름 을 헤 치고 해 를 볼 수 있다.
    여기 서 C\#하위 클래스 가 기본 클래스 방법 에 대한 계승,재 작성 과 숨겨 진 글 을 소개 합 니 다.더 많은 관련 C\#하위 클래스 가 기본 클래스 방법 에 대한 계승,재 작성 과 숨겨 진 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기