2011-09-27 2 views
3

설정 나는이 지나친거야하지만 클래스를 선언 할 때 과거에, 나는 이런 식으로 뭔가를 한 적이 있는지 확실하지 않습니다 :유형 선언에 대한 VAR를 사용하는 대신 명시 적 인터페이스 유형

IMyService myService = new MyService(); 

점프 myService으로 이동하면 IMyService 인터페이스로 이동합니다.

그러나 다음을 수행하면 (분명히) MyService이됩니다.

var myService = new MyService(); 

"올바른"사용으로 간주되는 것이거나 "What's your favourite ice cream flavor?"의 다른 예입니까?

나는 most relevant question을 보았지만 내 시나리오에는 실제로 대답하지 않습니다.

+0

귀하의 질문을 무언가를 제목이 오해의 소지가 있습니다. 콘크리트 유형 또는 인터페이스로 선언할지 여부를 묻습니다. 후발 자에게는 이점이 있지만 오직 당신 만이 그것을 알고 있습니다. – nawfal

+0

@nawfal 오해의 소지가 있다고 생각한다면, 그것을 이해할 수있는 것으로 변경할 수 있습니다. 그러나 3 년 동안 나에게 여전히 의미가 있습니다. –

+0

OP가 너무 과감하다고 생각하기 때문에 편집하지 않았습니다. 질문 제목은'var '에 대해 뭔가 묻습니다. 그러나 본질적으로 질문은 더 구체적인 유형과 인터페이스 유형입니다. 그래서 당신이'var'의 중요성을 찾고 있는지 또는 인터페이스의 중요성을 알고 싶은지 혼란 스러웠습니다. 당신이 명확히한다면 나는 그것을 편집 할 것입니다. 질질 마냥하지 말고, 더 나은 곳을 만들기 위해 노력하십시오. – nawfal

답변

1

글쎄요. MyService 클래스의 모든 공용 멤버가 IMyService 인터페이스의 구현에서 왔습니까? 아니면 (아마도 다른 인터페이스의 구현에서) 일부 여분의 공개 회원이 있습니까? 그렇다면 두 번째 "맛"을 통해 이러한 추가 멤버를 볼 수 있지만 첫 번째 멤버는 볼 수 없습니다.

반면에 인터페이스를 사용하는 경우 "올바른"사용법은 종속성 주입 엔진 또는 일부 종류의 팩토리 클래스 또는 메서드에서 유형 인스턴스를 얻는 것이라고 말할 수 있습니다. 이 질문의 범위.

+0

IOC에서 유형 인스턴스를 얻은 것이 맞습니다. 이것은 내가 신청할 때 염려하는 것 중 하나입니다. –

0

올바른 사용법의 의미에 따라 다릅니다. 인터페이스가있는 예제에서는 MyService 클래스의 객체를 만들고이를 IMyService 클래스의 "포인터"에 저장합니다. 그래서 개체는 실제로 MyService의 인스턴스이지만, myService var은 IMyService 인터페이스로 취급합니다. 따라서 어떤 메소드도 호출 할 수 없으며 MyService의 속성 중 IMyService에없는 속성에 액세스 할 수 없습니다.

샘플 var 샘플을 사용하면 선언 오른쪽에있는 변수 myService의 유형을 계산하도록 컴파일러에 알리는 것입니다. 따라서이 경우는 MyService myService과 완전히 동일하므로 myService 변수를 통해 MyService 클래스의 모든 공용 메서드와 속성에 액세스 할 수 있습니다.

1

myService이 원하는 유형입니까? 당신은이 제품이 IMyService reference 또는 MyService reference가되고 싶습니까? 일단 결정하면 나머지는 다음과 같습니다.

즉, 질문에만 답변 할 수 있습니다.

-1

실제 질문은 myService를 인터페이스로 정의하는 이유입니다. 그것은 당신이 다른 IMyService를 할당 할 수 있기를 원하지 않는다면별로 쓸모가 없습니다. 이 경우 인터페이스로 정의해야합니다. 다음 다른 코드에서이 VAR이 MyVar = IMyService 유형을 만들 것입니다

var myService = new MyService() as IMyService; 

이 옵션도 있습니다

+0

인터페이스의 사용은 다양합니다. 예를 들어 IOC와 조롱은 일부 답변에서 언급 되었기 때문에. 인터페이스가 없으면이 작업을 수행하는 것이 매우 까다 롭습니다. –

2

... ... 당신이 할 수는 ... 같은

if(myVar is MyService) 
{ 
    //instance specific stuff 
} 
관련 문제