C\#의 인 터 페 이 스 를 깊이 이해 하 다.
프로 그래 밍 에서 우 리 는 인 터 페 이 스 를 자주 사용 합 니 다.그것 은 무엇이 인터페이스 입 니까?
인 터 페 이 스 는 모든 클래스 나 구조 에 속 할 수 있 는 관련 기능 을 설명 하기 때문에 인터페이스의 클래스 나 구 조 를 실현 하려 면 인터페이스 정의 에서 지정 한 인터페이스 구성원 을 실현 해 야 한다.
인 터 페 이 스 는 interface 키 워드 를 사용 하여 정의 합 니 다.방법,속성,이벤트,색인 기 또는 이 네 가지 구성원 유형의 임 의 조합 으로 구성 할 수 있 습 니 다.
인터페이스의 특성:
1.인 터 페 이 스 는 추상 적 인 기류 와 유사 하기 때문에 인 터 페 이 스 를 직접 예화 할 수 없다.인터페이스 중의 방법 은 모두 추상 적 인 방법 으로 인 터 페 이 스 를 실현 하 는 모든 비 추상 적 인 유형 은 반드시 인터페이스의 모든 것 을 실현 해 야 한다.
성원
이 인터페이스의 구성원 을 명시 적 으로 실현 할 때 이 루어 진 구성원 은 클래스 인 스 턴 스 를 통 해 접근 할 수 없고 인터페이스 인 스 턴 스 를 통 해 만 접근 할 수 있 습 니 다.
이 인터페이스의 구성원 을 암시 적 으로 실현 할 때 실 현 된 구성원 은 클래스 인 스 턴 스 를 통 해 접근 할 수도 있 고 인터페이스 인 스 턴 스 를 통 해 접근 할 수도 있 지만 실 현 된 구성원 은 반드시 공유 해 야 한다.
2.인 터 페 이 스 는 상수,필드,연산 자,인 스 턴 스 구조 함수,석조 함수 또는 유형 을 포함 할 수 없고 정적 구성원 을 포함 할 수 없습니다.
3.인터페이스 구성원 은 자동 으로 공개 되 며 접근 수식 자 를 포함 할 수 없습니다.
4.인터페이스 자체 가 여러 개의 인터페이스 에서 계승 할 수 있 고 클래스 와 구 조 는 여러 개의 인 터 페 이 스 를 계승 할 수 있 으 나 인 터 페 이 스 는 계승 할 수 없다.
왜 인터페이스 에 있 는 방법의 수식 자 를 지정 할 수 없 습 니까?
인터페이스 에 있 는 방법 은 대상 간 통신 의 계약 을 정의 하 는 데 사용 되 며,인터페이스 에 있 는 방법 을 개인 또는 보호 로 지정 하 는 것 은 의미 가 없다.그것들 은 기본적으로 공유 방법 이다.
interface IProgram
{
void Fun();
}
class Program:IProgram
{
//
void IProgram.Fun()
{
Console.WriteLine("I am Fun.");
}
staticvoid Main(string[] args)
{
IProgram p =new Program();
// ,
p.Fun();
Console.Read();
}
}
위 에서 언급 한 바 와 같이 인 터 페 이 스 를 실현 하면 현식 실현 과 은 식 실현 이 가능 하 다 면 이 두 가지 실현 은 도대체 어떤 장단 점 이 있 습 니까?일반적인 상황 에서 유형 이나 구조 가 실현 해 야 할 것 은 하나의 인터페이스 이 고 암시 적 으로 실현 할 수 있다.
만약 에 클래스 나 구조 가 여러 개의 인 터 페 이 스 를 계승 하고 인터페이스 에 같은 이름 의 구성원 이 있 을 때 명시 적 으로 실현 해 야 한다.명시 적 실현 방식 이 존재 할 때 암시 적 실현 방식 은 효력 을 잃 는 다.
interface IProgram
{
void Fun();
}
interface IAProgram
{
void Fun();
}
class Program : IProgram, IAProgram
{
void IProgram.Fun() // IProgram
{
Console.WriteLine("I am IProgram Fun.");
}
void IAProgram.Fun() // IAProgram
{
Console.WriteLine("I am IAProgram Fun.");
}
//public void Fun() //
//{
// Console.WriteLine("I am Program Fun.");
//}
staticvoid Main(string[] args)
{
//IProgram p = new Program();
//p.Fun();
//IAProgram ap = new Program();
//ap.Fun();
Program pro =new Program();
((IProgram)pro).Fun();
((IAProgram)pro).Fun();
Console.Read();
}
}
결 과 는:I am IProgram Fun. I am IAProgram Fun.
인터페이스의 계승:
인터페이스 계승 과 클래스 계승 이 다르다.우선,클래스 계승 은 계승 을 설명 할 뿐만 아니 라 계승 도 실현 한다.인터페이스 상속 은 상속 을 설명 하 는 것 일 뿐이다.
즉,파생 류 는 기 류 를 계승 하 는 방법 으로 이 루어 질 수 있 고 파생 된 인 터 페 이 스 는 부모 인터페이스의 구성원 방법 만 설명 하고 부모 인터페이스의 실현 을 계승 하지 않 는 다.
그 다음으로 C\#중 류 계승 은 단일 계승 만 허용 하지만 인터페이스 계승 은 다 중 계승 을 허용 하고 하나의 키 인 터 페 이 스 는 여러 개의 부모 인터페이스 가 있 을 수 있다.
인 터 페 이 스 는 0 또는 여러 인터페이스 에서 계승 할 수 있다.여러 인터페이스 에서 계승 할 때":"후 와 계승 되 는 인터페이스 이름,여러 인터페이스 이름 사이 에","분할"을 사용 합 니 다.
계승 되 는 인 터 페 이 스 는 접근 할 수 있어 야 합 니 다.예 를 들 어 private 형식 이나 internal 형식의 인터페이스 에서 계승 하 는 것 은 허용 되 지 않 습 니 다.
인 터 페 이 스 는 직접 또는 간접 적 으로 자신 에 게 서 물 려 받 을 수 없다.클래스 의 계승 과 비슷 하고 인터페이스의 계승 도 인터페이스 간 의 차원 구 조 를 형성한다.
interface IProgram
{
void Fun();
}
interface IAProgram:IProgram
{
}
class Program : IAProgram
{
void IProgram.Fun()
{
Console.WriteLine("I am IProgram Fun.");
}
staticvoid Main(string[] args)
{
Program pro =new Program();
((IAProgram)pro).Fun();
Console.Read();
}
}
인터페이스의 덮어 쓰기:인터페이스의 실현 은 방법 체 가 없고 추상 적 인 방법 도 방법 체 가 없 기 때문에 우리 가 인터페이스의 실현 방법 에서 추상 적 인 방법 을 호출 할 때 어떻게 집행 합 니까?
interface IProgram
{
void Fun();
}
abstractclass AProgram : IProgram
{
publicabstractvoid AFun();
void IProgram.Fun()
{
AFun();
}
}
class Program:AProgram
{
publicoverridevoid AFun()
{
Console.WriteLine("I am AProgram.");
}
staticvoid Main(string[] args)
{
IProgram pro =new Program();
pro.Fun();
Console.Read();
}
}
결과:I am Aprogram.
정지점 을 통 해 pro.Fun()을 실행 할 때 볼 수 있 습 니 다.이 때 먼저 인터페이스의 실현 방법 에 뛰 어 든 다음 에 추상 함수 의 실현 방법 을 호출 하고 추상 함수 의 방법 이 실 현 된 후에 인터페이스의 실현 방법 으로 돌아 가 집행 이 완 료 될 때 까지 한다.
우리 가 인 터 페 이 스 를 실현 하 는 방법 에서 가상 함 수 를 호출 할 때?
interface IProgram
{
void Fun();
}
class AProgram : IProgram
{
publicvirtualvoid AFun() //
{
Console.WriteLine("I am virtual AFun.");
}
void IProgram.Fun()
{
AFun();
}
}
class Program:AProgram
{
publicoverridevoid AFun() // Override
{
Console.WriteLine("I am override AFun.");
}
staticvoid Main(string[] args)
{
IProgram pro =new Program();
pro.Fun();
Console.Read();
}
}
이때 우 리 는 집행 순서 가 이전 예 와 같다 는 것 을 발견 했다.그래서 결 과 는:I am override AFun.
이 를 통 해 우 리 는 오 버 라 이 드 키 워드 를 new 로 바 꿀 때 계속 연상 할 수 있다.같은 결과 일 까,아니면 우리 가 이전에 말 한 예 와 마찬가지 로 숨 기 는 것 일 까?
우 리 는 위의 예 를 개선 했다.
interface IProgram
{
void Fun();
}
class AProgram : IProgram
{
publicvirtualvoid AFun()
{
Console.WriteLine("I am virtual AFun.");
}
void IProgram.Fun()
{
AFun();
}
}
class Program:AProgram
{
publicnewvoid AFun()
{
Console.WriteLine("I am new AFun.");
}
staticvoid Main(string[] args)
{
Program pro =new Program();
((IProgram)pro).Fun();
pro.AFun();
Console.Read();
}
}
결 과 는:I am virtual AFun. I am new AFun.
앞에서 말 했 듯 이 여 기 는 이에 대해 분석 하지 않 습 니 다.이 를 통 해 뉴 키 워드 를 사용 하 는 것 은 이 를 숨 기 는 것 임 을 알 수 있 습 니 다.인터페이스 실현 방법 에서 가상 방법 을 호출 할 때 클래스 의 실행 과정 과 같 습 니 다.
인터페이스 와 추상 류 의 차이.
다른:
총결산
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.