2014-04-09 4 views
-3

Initializing an Interface?에서 질문을 확장하면 구현 된 클래스로 초기화하면서 인터페이스를 인스턴스화합니다.인터페이스 인스턴스화

제가 궁금한 점은 처음에 인터페이스로 인스턴스화하는 이유는 무엇입니까? 구현 된 클래스로 직접 인스턴스를 생성 할 수없는 이유는 무엇입니까? 예를 들어. :

Doc mydoc = new SimpleDoc(); 

여기서 Doc는 인터페이스이고 SimpleDoc은이를 구현합니다. 의 문제점은 무엇입니까? SimpleDoc mydoc = new SimpleDoc(); 이것이 어디에서 실패할까요?

+0

귀하의 질문에 이미 링크 된 질문에 의해 답변되었습니다. BTW : 실제로 시도해 본다면 실패하지 않을 것입니다. –

+0

나는이 질문에 대한 이유를 거기서 얻지 못했다. –

+0

이 예제에서는 실패하지 않을 것이라는 점에 동의합니다. 그러나 나는 그것이 있을지도 모르는 곳이 있는지 묻는다. 그렇지 않다면, 우리는 왜 그 필요성을 필요로 하는가? –

답변

0

일반적으로 시스템 내에서 추상 유형 (인터페이스 또는 추상 클래스)을 사용하는 것이 좋습니다. 당신의 예에서

, 당신은 참으로 작성할 수

SimpleDoc mydoc = new SimpleDoc() 

문제가 구체적인 유형 SimpleDoc에 따라 달라집니다 mydoc를 사용하는 코드입니다 그러나. 이것은 반드시 그 자체로 문제가되는 것은 아니지만 Doc의 새 구현 (예 : ComplexDoc)을 만든다고 가정합니다.

ComplexDoc mydoc = new ComplexDoc(); 

지금 당신이 mydoc는 것을 전달하는 모든 장소 방법을 변경하는 :

당신은 당신의 선언을 변경할 것입니다.

그러나 당신이 당신이 만들 수있는 하나의 변경이있을 것이다 처음에 Doc을 사용했다 :

Doc mydoc = ComplexDoc(); 

하나를 전환하는 것이 일반적입니다 컬렉션 API, 작업 할 때 특히 유용합니다 테스트 케이스에서 Mocking을 사용할 때 또는 다른 구현.

+0

제가 가지고있는 아이디어를 알려주세요. 인터페이스 클래스 객체를 생성하고 값이 메소드에서오고 그 메소드가 객체 클래스를 반환 할 수 있다고 가정합니다. 이 경우 유용할까요? –

+0

가져 오기는 인터페이스에 따라 구현을 최소한으로 바꿀 수 있습니다. 비록 OO의 모든 것과 마찬가지로, 이것은 현명하게 사용되어야하며 적절할 때 결정을 내려야합니다. –

+0

예. 옳은. 감사 –

0

클라이언트 코드에서 구현 클래스 대신 인터페이스를 사용하는 경우 클라이언트 코드를 변경하지 않고 구현을 변경할 수 있습니다. 우리는 우리가 예를 살펴 보자

바인딩 가상 메소드 호출 또는 늦은로 불리는 것입니다

+0

나는 이것을 따라 갔는지 확신하지 못한다. –

0

. 이 다중 상속이 있기 때문에

public interface Vegetarian{} 
public class Animal{} 
public class Deer extends Animal implements Vegetarian{} 

이제, 사슴 클래스는 다형성로 간주됩니다. 위의 예를 들어 사실 다음과 같습니다

A Deer IS-A Animal 

A Deer IS-A Vegetarian 

A Deer IS-A Deer 

A Deer IS-A Object 

우리는 사슴 객체 참조에 대한 참조 변수 사실을 적용 할 때, 다음과 같은 선언은 법적 있습니다 :

Deer d = new Deer(); 
Animal a = d; 
Vegetarian v = d; 
Object o = d 

모든 참조 변수는 동일한 참조 d,a,v,oDeer 힙에있는 오브젝트.

0

당신이 작성하는 경우 :

SimpleDoc mydoc = new SimpleDoc(); 

모든 추가 코드가 구현 클래스 SimpleDoc에 의해 노출 된 세부 사항에 따라 달라질 수 있습니다. 하지만 작성하는 경우 :

Doc mydoc = new SimpleDoc(); 

추가적인 코드는 코드를 만들 Doc에 의해 노출 된 측면에 의존의 나 당신이 작성하는 미래에 결정하는 경우에도 작동 :

Doc mydoc = new ComplexDoc(); 

좋은 예를 들어 당신이 작성하는 경우

ArrayList 
LinkedList 

: 차이는 적어도 두 가지 구현이있는, List입니다

,369
List list = new ArrayList(); 

당신은 나중에 그것을 대체 할 자유 :

List list = new LinkedList(); 

변수 list에 의존하는 코드를 깨지 않고 (당신이 list의 구현 고유의 기능에 액세스 할 수 캐스트 또는 반사를 사용하지 않은 가정).

관련 문제