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 로 컴 파일 한 후에 두 가지 함수 호출 방식 이 있다.
여기 서 사용 하 는 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 은 가상 방법 입 니 다.우 리 는 대상 의 인 스 턴 스 를 고려 하여 호출 할 방법 을 결정 해 야 합 니 다.
총결산
하위 클래스 가 기본 클래스 에 대해 계승,재 작성,숨 기 는 방법 이 있 는 상황 에서 구체 적 으로 어떤 방법 이 호출 되 는 지 판단 하 는 것 이 어렵 지만 다음 과 같은 요점 을 기억 하 세 요.
호출 된 방법 이 가상 이 아니라면 인용 변수 유형 에 만 관심 을 가 져 야 합 니 다.인용 변수 유형 은 호출 방법 이 어디 에 있 는 지 결정 할 수 있 습 니 다.호출 방법 이 가상 이 라면 인용 변수 유형의 측면 에서 이 방법 이 대상 유형 에 의 해 재 작성 되 었 는 지 확인 해 야 합 니 다.만약 그렇다면 대상 형식의 재 작성 방법 을 호출 합 니 다.반대로 인용 변수 형식 에 호출 방법 을 다시 결정 하도록 합 니 다.
이렇게 하면 우 리 는 하위 클래스 가 기본 적 인 방법 을 숨 기 는 상황 을 다시 만나면 상기 요점 을 응용 하면 구름 을 헤 치고 해 를 볼 수 있다.
여기 서 C\#하위 클래스 가 기본 클래스 방법 에 대한 계승,재 작성 과 숨겨 진 글 을 소개 합 니 다.더 많은 관련 C\#하위 클래스 가 기본 클래스 방법 에 대한 계승,재 작성 과 숨겨 진 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.