C# 인터페이스 및 추상 클래스

9694 단어 C#

C# 인터페이스 및 추상 클래스


클래스 계승은 매우 강한 메커니즘이지만 계승의 진정한 강점은 인터페이스에서 계승할 수 있다는 것이다.

이해 인터페이스


새로운 클래스를 정의하여 대상 집합을 저장하고 프로그램이 집합 중의 대상 유형 순서에 따라 대상을 얻을 수 있도록 하는 방법을 제공한다.예를 들어 문자열 유형은 문자열의 정렬 규칙에 따라 정렬한다.예를 들어 int 형식은 크기에 따라 정렬합니다.그러나 수용하는 대상의 유형이 다르기 때문에 정렬 방법을 정의할 때 대상을 어떻게 정렬하는지 모른다.현재 문제는 집합 클래스를 정의할 때 유형을 알 수 없는 대상을 정렬하는 방법을 어떻게 제공하는가이다.겉으로 보기에는 파생류가 다시 쓸 수 있는 허황된 방법을 성명함으로써 해결할 수 있을 것 같다.그러나 집합 클래스와 대상 사이에는 어떠한 계승 관계도 존재하지 않는다.합리적인 방법은 집합 중의 모든 대상이 집합할 수 있는 정렬 방법으로 호출할 수 있는 방법을 제공하여 대상의 상호 비교를 실현해야 한다고 규정하는 것이다. 즉, 하나의 인터페이스를 정의하고 인터페이스에 호출될 수 있는 방법을 포함해야 한다(인터페이스를 실현한 클래스는 인터페이스에 규정된 방법이 반드시 포함된다). 인터페이스에 정렬 방법을 정의하고 정렬 기능만 설명하며 구체적인 실현은 실현된 클래스에게 맡긴다.

인터페이스 정의

interface Icomparable
{
	int CompareTo(object obj);
}

클래스의 정의와 비슷합니다.class 키워드가 아닌인터페이스 인터페이스에서 클래스와 구조와 같은 방식으로 방법을 설명합니다.액세스 수식자 (public,private,protected를 지정할 수 없음) 를 지정할 수 없습니다. 또한 인터페이스의 방법은 실현되지 않았습니다. 인터페이스의 모든 유형은 자신의 실현 인터페이스에 데이터가 포함되지 않는다는 것을 성명할 뿐입니다.인터페이스에 필드를 추가할 수 없습니다. (개인적으로도 안 됩니다.)

실현 인터페이스

interface ILandBound
{
	int NumberOfLegs();
}

class Horse : ILandBound
{
	...
	public int NumberOfLegs()
	{
		return 4;
	}
}

상술한 예는 모든 동물에게 Number Oflegs(다리 수)라는 방법을 제공하여 인터페이스인 IlandBound를 정의하여 이 방법을 포함하고Horse류에서 실현할 수 있도록 하는 것이다.동물마다 다리 수가 다르기 때문에 되돌아오는 값도 다르기 때문에 인터페이스를 정의하면 이 방법을 포함한다.인터페이스를 실현할 때 반드시 모든 방법이 대응하는 인터페이스 방법과 완전히 일치해야 한다
  • 방법명과 반환 형식이 완전히 일치합니다.
  • 모든 매개 변수(ref와out 키워드 수식자 포함)가 완전히 일치
  • 인터페이스를 실현하는 데 사용되는 모든 방법은public 접근성이 있어야 한다.

  • 하나의 클래스는 하나의 클래스에서 계승하는 동시에 인터페이스를 실현할 수 있다
    class Mammal// 
    {
    	...
    }
    class Horse : Mammal,ILandBound
    {
    	...
    }
    

    기본 클래스 이름을 먼저 쓰고, 쉼표를 쓰고, 인터페이스 이름을 쓰면 한 인터페이스가 다른 인터페이스에서 계승될 수 있지만, 이를 인터페이스 확장이라고 하는 것이지, 계승이 아니다

    인터페이스를 통해 클래스 참조


    인터페이스 변수도 이 인터페이스의 클래스를 실현한 대상을 인용할 수 있다
    Horse myHorse = new Horse();
    IlandBound iMyHourse=myHorse;// 
    

    하지만 Horse 변수에 IlandBound 객체를 지정할 수는 없습니다.

    다중 인터페이스 사용


    하나의 종류는 최대 하나의 기류만 있을 수 있지만, 수량에 제한이 없는 인터페이스를 실현할 수 있지만, 반드시 인터페이스에 규정된 모든 방법을 실현해야 한다.

    명시적 실현 인터페이스


    만약 서로 다른 인터페이스 방법의 이름이 같다면, 클래스에서 인터페이스를 현시적으로 실현해야 한다
    interface IlandBound
    {
    	int NumberOfLegs();// 
    }
    interface IJourney
    {
    	int NumberOfLegs();// 
    }
    class Horse : ILandBound,IJourney
    {
    	int ILandBound.NumberOfLegs()
    	{
    		return 4;// 
    	}
    	int IJourney.NumberOfLegs()
    	{
    		return 3;// 
    	}
    }
    

    어느 방법이 어느 인터페이스를 실현했는지 구분하다

    인터페이스 제한


    인터페이스는 영원히 어떤 실현도 포함하지 않는다는 것을 명심하라
  • 정적 필드를 포함하여 인터페이스에서 더 이상 정의할 수 없습니다.필드는 본질적으로 클래스나 구조의 실현 디테일
  • 인터페이스에서 어떤 구조기도 정의할 수 없습니다.구조기도 상기 두 가지 실현 디테일
  • 인터페이스에서 어떤 방법으로도 접근 수식자를 지정할 수 없습니다.인터페이스의 모든 방법은 비공식
  • 인터페이스에 어떤 유형(매거진, 구조, 클래스 또는 다른 인터페이스)도 끼워넣을 수 없음
  • 구조나 클래스를 계승하는 것을 허용하지 않습니다.구조와 유형은 실현을 포함한다.이들로부터 상속받으면 상속 실현
  • 추상류


    만약 양과 말 두 종류가 모두 포유류와 육지류를 계승하고 식초방법의 인터페이스를 실현해야 한다면 그들의 코드는 매우 중복될 것이다. 예를 들어 풀을 먹는 방법이 같다는 등이다. 그러므로 새로운 종류의 식초포유류를 정의하고 포유류를 계승하는 동시에 식초인터페이스를 실현해야 한다. 그리고 말류와 양류는 식초포유류와 육지류만 계승하면 된다. 두 종류가 모두 식초방법을 실현하지 않아도 된다.식초포유류의 유일한 역할은 말과 양 등 종류를 그것으로부터 계승하는 것이다. 이것은 단독으로 존재하는 실체, 즉 이런 종류를 만드는 실례를 허용하지 않기 때문에 반드시 이 종류를 추상류로 표시하고 abstract 키워드로 실현해야 한다.
    abstract class GrazingMammal : Mammal,IGrazable
    {
    	...
    }
    class Horse : GrazingMammal,ILandBound
    {
    	...
    }
    class Sheep : GrazingMammal,ILandBound
    {
    	...
    }
    

    추상적 방법 추상류는 추상적 방법을 포함할 수 있다.원칙적으로 허법과 비슷하다.다만 방법 주체를 포함하지 않고 파생류는 반드시 이런 방법을 다시 써야 하며 추상적인 방법은 사유할 수 없다.예를 들어 하나의 방법이 추상류에서 기본적인 실현을 제공하는 것은 의미가 없지만 파생류가 이 방법의 실현을 제공해야 하기 때문에 추상적인 방법으로 정의하기에 적합하다.

    밀봉류


    하나의 클래스를 기본 클래스로 사용하지 않으려면 sealed 키워드로 기본 클래스를 방지합니다
    sealed class Horse
    {
    	...
    }
    

    밀봉류는 어떠한 허위적인 방법도 성명할 수 없고 추상류는 밀봉할 수 없다

    좋은 웹페이지 즐겨찾기