C #이 인터페이스에서 속성을 허용하는 이유는 무엇입니까?


47

C #에서 다음 코드는 유효합니다

interface I{
    int property{get;set;}
}

나에게는 말이되지 않습니다. 이것은 인터페이스의 가장 중요한 원칙 중 하나 인 상태 부족 (즉, 필드 없음)을 위반하는 것 같습니다. 속성이 암시 적 개인 필드를 작성하지 않습니까? 인터페이스에 그렇게 나쁘지 않습니까?


12
상태 부족이 인터페이스 구현 의 원칙 중 하나 입니까? 나에게 인터페이스는 계약을 정의하는 방법입니다. 즉, 클래스가 그러한 인터페이스를 구현하는 경우 계약에 정의 된 모든 메서드와 속성이 있습니다.
Florian Margaine

4
속성은 단지 get 메소드와 set 메소드입니다. 인터페이스는 구현해야하는 메소드 목록 일 뿐이므로 인터페이스가 가질 수있는 것은 당연합니다.
Doval

1
@FlorianMargaine 계약의 개념은 인터페이스의 가장 중요한 원칙이지만, 국가의 부재도 중요합니다. 이를 통해 추상 클래스와 분리 할 수 ​​있습니다. Java 8의 IE는 인터페이스와 추상 클래스의 유일한 주요 차이점입니다.
복원 Monica Monica


2
@Doval : 인터페이스 그러한 메소드를 선언 하는 것은 당연 하지만 구현하지는 않습니다.
Giorgio

답변:


65

혼란스러운 부분은 int Property { get; set; }클래스 내부에 글을 쓰면 암시 적 뒷받침 필드가있는 자동 속성이라는 것입니다.

그러나 인터페이스에 정확히 같은 것을 쓰면 자동 속성이 아니며 속성이 인터페이스의 일부이며 인터페이스를 구현하는 모든 유형이 해당 속성을 자동 속성으로 포함해야 함을 선언합니다. )이지만 지원 입력란을 만들지는 않습니다.

차이점을 보는 한 가지 방법은 쓰는 것입니다 int Property { get; }. 인터페이스에서 유효하며 게터 만 있지만 세터는없는 속성을 선언합니다. 그러나 자동 속성에는 setter가 있어야하기 때문에 C # 6.0을 사용하지 않는 한 클래스에서 컴파일되지 않습니다.


18

당신이 보여준대로 속성을 정의하는 방법을 정의하는 것과 동일 int GetProperty()하고 void SetProperty(int i). C #에서는 속성이 강력합니다.

C #에서 속성은 암시 적으로 개인 필드를 만들지 않습니다. auto-property예를 들어, 기본 구현입니다. public string MyString { get; set;}그러나 get메서드 에서 사용자 지정 논리를 정의하는 속성 은 암시 적 개인 필드를 생성하지 않습니다.

마지막으로, 인터페이스가 퍼블릭 API 와 관련되어 있으므로 인터페이스 속성의 구현이 개인 필드에 의존하는 경우 (암시 적 또는 다른 방식) 무엇이 중요할까요? 그것은 인터페이스의 소비자들과 상관없이 숨겨져 있습니다.


Ahh ... 자동 속성에서만 발생한다는 것을 알지 못했으며 재정의해야하기 때문에 의미가 있습니다. 그러나 인터페이스가 내부 개인 변수를 작성하는 경우 구현자는 해당 변수에 액세스 할 수 없습니다. 이는 명백한 문제입니다.
복원 상태 Monica

9
C # 인터페이스에서 속성을 정의하면 해당 속성의 구현은 구현 클래스에 맡겨집니다. 속성을 자동 속성으로 만들거나 원하는대로 사용자 지정 논리를 정의 할 수 있습니다. 인터페이스에 필드가 추가되지 않습니다 .
NWard

10

속성 방법입니다! 인터페이스 를 구현 하는 백킹 필드가 클래스에 추가됩니다 (수동 또는 자동 속성을 통해).


때로는 지원 필드가 없습니다. get과 set을 정의하는 것은 드물지만 backing field가 없습니다.
Stephen

+1 속성은 메소드입니다! 예! 나는 Propertymethods를 작성하는 것을 좋아하지만 코드 검토 동료는 그렇게 보지 못하며 우리 프로그램에서 멋진 표현 캡슐화를위한 기회를 놓치게됩니다.
radarbob

그러나 이러한 "속성 방법"은 DB 조회 나 다른 항목이없는 것처럼 빠릅니다. 속성 액세스가 빠르다는 암묵적인 계약이 있습니다. Get * 메서드가 느릴 수 있습니다.
Trey Mack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.