C\#의 계승 깊이 이해
계승,패 키 징 과 다 태 는 대상 을 대상 으로 프로 그래 밍 하 는 중요 한 특성 이다.
그 구성원 이 계승 되 는 종 류 는 기 류 라 고도 부 르 고 그 구성원 을 계승 하 는 종 류 는 파생 류 라 고도 부 르 며 자 류 라 고도 부른다.
파생 류 은 식 은 기본 클래스 의 구조 함수 와 석조 함 수 를 제외 한 모든 구성원 을 얻 을 수 있 습 니 다.파생 류 는 하나의 직접 기본 클래스 만 있 을 수 있 기 때문에 C\#는 다 중 계승 을 지원 하지 않 지만 하나의 기본 클래스 는 여러 개의 직접 파생 클래스 가 있 을 수 있 습 니 다.
계승 은 전달 할 수 있다.
즉,
ClassB
파생ClassC
,ClassA
파생ClassB
이 발생 하면 ClassC
은ClassB
과ClassA
에서 밝 힌 구성원 을 계승 할 것 이다.
class A
{
public void Sum(int i,int j)
{
int sum = i + j;
Console.WriteLine("I am A ,my sum ={0}",sum);
}
}
class B : A
{
public void Minus(int i,int j)
{
int minus = i - j;
Console.WriteLine("I am B ,my minus ={0}", minus);
this.Sum(3, 4);
}
}
class InheritanceTest1
{
static void Main(string[] args)
{
B b = new B();
b.Minus(3, 4);
Console.Read();
}
}
결과:I am B ,my minus=-1
I am A ,my sum = 7
기 류 Sum()방법 이 사유 일 때 파생 류 가 이 방법 을 계승 할 수 있 을 까?
본인 의 테스트 를 통 해 B 류 에서 이 방법 을 찾 지 못 했다 면 그것 은 계승 되 지 않 았 을 까?사실은 그렇지 않 습 니 다.개인 구성원 은 이미 계승 되 었 지만 그들 은 방문 할 수 없습니다.개인 구성원 은 그들의 유형 이나 구조 체 에서 만 방문 할 수 있 기 때문에 계승 되 지 않 은 것 처럼 보 입 니 다.
만약 우리 가 접근 의 기본 을 낮 추고 싶다 면,우 리 는 기본 클래스 Sum()방법 을
protected
로 정의 할 수 있다.어떤 종류 가 다른 종류 에 의 해 계승 되 는 것 을 막 을 수 있 습 니까?
정 답 은 가능 합 니 다.C\#는 sealed 수식 자 를 제공 합 니 다.이 수식 자 는 다른 종류의 계승 을 막 을 수 있 습 니 다.
sealed class A
{
int test;
public void Sum(int i,int j)
{
int sum = i + j;
Console.WriteLine("I am A ,my sum ={0}",sum);
}
}
class B : A
{
public void Minus(int i,int j)
{
int minus = i - j;
Console.WriteLine("I am B ,my minus ={0}", minus);
this.Sum(3, 4); //
}
}
앞에서 말 했 듯 이 파생 류 은 식 은 기본 클래스 의 구조 함수 와 석조 함 수 를 제외 한 모든 구성원 을 얻 었 다.그렇다면 우 리 는 어떻게 기류 의 구조 함수 와 자신의 구조 함 수 를 얻어 야 합 니까?
우 리 는 기본 클래스 의 초기 화 작업 은 기본 클래스 의 구조 함수 에 의 해 이 루어 지고 파생 클래스 의 초기 화 작업 은 파생 클래스 의 구조 함수 에 의 해 이 루어 진 다 는 것 을 알 고 있 으 나 이렇게 해서 파생 류 구조 함수 의 집행 순서 문제 가 발생 했다.
기본 클래스 에 구조 함수 가 없고 파생 클래스 에 구조 함수 가 없 을 때 파생 클래스 의 새로운 구성원 의 초기 화 작업 은 다른 공유 함수 로 이 루어 집 니 다.
public class A
{
int test=0;
public void sum()
{
test++;
Console.WriteLine("I am test ={0}" ,test);
}
}
class B : A
{
int i;
public void PrintInt()
{
i = 3;
Console.WriteLine("I am i ={0}", i);
}
}
class InheritanceTest1
{
static void Main(string[] args)
{
B b = new B();
b.PrintInt();
Console.Read();
}
}
결과:I am i=3
파생 류 만 구조 함 수 를 정의 할 때 파생 류 대상 을 구성 하면 된다.대상 의 기본 클래스 부분 은 기본 구조 함 수 를 사용 하여 자동 으로 생 성 됩 니 다.기본 류 와 파생 류
구조 함수 가 있 을 때 실행 순 서 는 어떻게 됩 니까?
만약 에 기본 클래스 에 매개 변수 가 없 는 구조 함수 라면 그 는 파생 류 에 의 해 암시 적 으로 실 행 될 수 있다.즉,파생 류 는 구조 함 수 를 포함 할 필요 가 없다.만약 에 기본 클래스 에 매개 변수 가 없 는 구조 함수 라면 파생 류 에서 매개 변수 가 있 는 구조 함수 Publicclasa 를 사용자 정의 할 수 있다.
public class A
{
int test=0;
public A()
{
test = 5;
Console.WriteLine("I am A ,test={0}", test);
}
}
class B : A
{
}
class InheritanceTest1
{
static void Main(string[] args)
{
B b = new B();
Console.Read();
}
}
결과:I am A 공유 기본 구조 함수,test=5
이 를 통 해 기본 적 인 구조 함수 가 실행 되 고 파생 류 에서 호출 되 는 것 을 볼 수 있다.
만약 에 기본 클래스 가 매개 변 수 를 가 진 구조 함 수 를 정의 한다 면 이 구조 함 수 는 반드시 실행 되 어야 하고 파생 클래스 에서 이 구조 함 수 를 실현 해 야 합 니 다.이때 우 리 는 base 키 워드 를 사용 할 수 있 습 니 다.
class A
{
int test=0;
public A(int i)
{
test = i;
Console.WriteLine("I am A ,test={0}", test);
}
}
class B : A
{
public B(int j):base(j)
{
Console.WriteLine("I am B ,j={0}",j);
}
}
class InheritanceTest1
{
static void Main(string[] args)
{
B b = new B(1);
Console.Read();
}
}
결과:I am A 공유 삼 구조 함수,test=1
I am B 공유 구조 함수,j=1
이 를 통 해 알 수 있 듯 이 파생 류 암시 적 실행 기본 클래스 에 매개 변 수 를 가 진 구조 함 수 는 프로그램 에서 기본 클래스 에서 매개 변 수 를 가 진 구조 함 수 를 정의 하고 파생 류 에서 계승 되 며 base 키 워드 를 사용 하여 기본 클래스 의 구조 함 수 를 호출 하여 파 라 메 터 를 전송 합 니 다.
우 리 는 코드 에서 파생 류 를 만 드 는 대상 을 볼 수 있 습 니 다.프로그램 은 먼저 기본 적 인 구조 함수 의 내용 을 실행 한 다음 에 파생 류 의 내용 입 니 다.
만약 에 파생 류 의 기류 도 파생 류 라면 모든 파생 류 는 직접적인 기류 의 구조 만 책임 지고 간접 기류 의 구 조 를 책임 지지 않 으 며 구조 함 수 를 집행 하 는 순 서 는 맨 위의 기류 에서 시작 하여 마지막 파생 류 가 끝 날 때 까지 이다.
총결산
이 글 은 여기까지 입 니 다.당신 을 도 울 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.