2015-02-03 2 views
0

나는 항상 내 마음 속에이 질문을 가지고있다. 인터페이스는 구현 자 클래스가 특정 메서드 나 속성 또는 이벤트를 갖도록합니다. 그러나 구현 자 클래스가 특정 생성자를 갖도록 강제 할 수없는 이유는 무엇입니까?왜 인터페이스에 생성자가 있습니까?

:

interface IX 
{ 
    ctor(int val); 

    string Foo(); 
} 

을 .. 그리고이 IX를 구현하는 모든 클래스를 매개 변수로서 int와 생성자를 가져야한다는 것을 의미한다.

사용법은 간단하지 않습니다. 이는 클래스가 IX 인터페이스를 구현 한 경우 개발 팀의 아무도 해당 생성자를 자신의 클래스에 넣는 것을 잊지 않았 음을 보증합니다. 이러한 클래스가 반영 또는 Activator에 의해 인스턴스화되는 상황을 고려하십시오.

+1

[생성자 시그니처를 정의하는 인터페이스] 가능한 복제본 (0120) (영문) – Jonesopolis

+0

인터페이스에서 생성자를 어떻게 사용합니까? – SLaks

답변

0

인터페이스는 생성자가 없으므로 인터페이스가 아무 것도없는 인스턴스이며 구성 할 것이 없습니다. 인터페이스를 구현하는 특정 유형은 인터페이스를 구현할 때 생성되어 내부 상태를 초기화 할 수 있습니다.

인터페이스는 어떤 종류의 내부 상태를 나타내지도 않으며 (인터페이스의 일부 구성원이 구현하는 유형의 내부 상태에서 데이터를 노출하지도 않음) 따라서 실행중인 (심지어 의미하는) 인터페이스의 생성자.

편집 : 특정 예를 ctor(int val);IX를 구현하는 모든 종류의 int 멤버 변수의 일종 가정을 만들지 만 이것은 구현의 세부 사항이다. 인터페이스의 목적은 유형이 what 일 수 있고, how이 아니라 정의하는 것입니다. 다른 유형에 대한 IX의 구현은 인터페이스를 만족시키기 위해 내부적으로 모두 제공하는 한 매우 다를 수 있습니다.

class A : IX 
{ 
    public A (string sData) { ... } 

    // ... 
} 

구분 된 문자열의 일부가 아직 수 IX를 충족하는 데 필요한 int, 하나의 int 생성자는 다음과 같습니다 예를 들어

는 입력으로 구분 된 문자열을 필요로하는 타입이 제대로 작동 생각 이 클래스에 부적절한 경우 : 단일 int은이 클래스의 올바른 작동에 필요한 다른 모든 데이터를 전달할 수 없습니다.

+0

귀하의 회사에서 모든 개발자가 특정 생성자를 런타임에 반성 또는 Activator에 의해 인스턴스화되는 클래스에 넣었음을 보장 할 수 있습니까? – RezaRahmati

+0

왜 그런 보증이 필요합니까? 기본 생성자가 충분하지 않은 경우에만 명시 적으로 구문 분석기가 필요합니다. 즉, 특정 유형의 연산을 사용하기 전에 특정 유형의 연산을 수행해야합니다. 유형이 컴파일러에 의해 생성 된 기본값으로 살아갈 수있는 경우 생성자가 필요하지 않습니다. – xxbbcc

+0

또한, 여러 가지 유형의 특정 생성자는 동일한 기본 클래스를 공유하지 않는 한 많은 의미가 없습니다. 여러 유형의 독립형을 사용하는 경우 (동일한 인터페이스를 구현하더라도) 일치하는 내부 상태를 가질 확률이 매우 높습니다. 동일한 기본 클래스를 공유하는 유형이있는 경우 기본 클래스는 올바른 서명을 제공하는 생성자를 가질 수 있으며 파생 클래스는 필요에 따라 해당 생성자를 호출 할 수 있습니다. – xxbbcc

0

다형성 때문에 인터페이스에 생성자 을 강제 적용하는 것이 바람직하지 않다고 생각합니다. 그것이 처음 마음에 떠오르는 것입니다.

2

인터페이스의 포인트는 인터페이스에서 사용할 수있는 멤버 집합을 정의하는 것입니다.

인터페이스에서 함수 또는 속성을 선언하면 해당 인터페이스로 선언 된 모든 변수에서 해당 함수 나 속성을 호출 할 수 있습니다.

대조적으로 인터페이스에 선언 된 생성자를 사용할 수있는 방법은 없습니다.

+0

사용법이 간단하지 않다. 클래스가 인터페이스를 구현했다면 클래스에 특정 생성자가 있다고 확신 할 수있다. 개발팀에서는 클래스에 해당 생성자를 넣는 것을 잊지 못할 수도있다. – RezaRahmati

0

구현은 구현에 따라 크게 달라집니다. 구성을 구체화 할 방법을 지정해야 할 이유가 없습니다. 인스턴스를 만들고 싶다면 클래스를 인스턴스화 한 다음 제공된 특정 생성자 중에서 선택해야합니다. 인터페이스를 구현할 수 없으므로 계약자 서명을 제공하는 것이 무엇을 의미합니까?

0

수 있습니다. 그러나 인터페이스는 구현 계약 일뿐입니다. 구현이 구현 계약을 어떻게 이행하는지는 중요하지 않습니다. 구현 자에게 특정 생성자를 강제로 강제하여 구현시 불필요하게 제한하고 아무런 이점도 없습니다. 객체 생성을위한 특정 매개 변수를 적용하려는 경우 팩토리 메소드를 구현하는 것이 더 쉽고 유연합니다.

0

특정 구현을 부과하기보다는 동작을 캡슐화하는 방법으로 인터페이스를 생각할 때 생성자를 포함하지 않는 것이 좋습니다. 생성자는 캡슐화 된 비헤이비어에 영향을주지 않지만 클래스의 구조와 클래스가 초기화되는 방식을 결정합니다.

관련 문제