2013-11-24 1 views
-2

코드에서 우리는 Interface (이것을 InterfaceMap이라고 부름) 시트 (putCell(), getCell() 등)에 셀을 넣을 수있는 메소드가 있어야합니다.유형이 인터페이스 인 개인 속성을 사용할 수 있습니까?

우리는 해당 인터페이스 맵을 구현하는 OurSheetMatrix 클래스를 가지고 있습니다. 나는 우리가하지 인터페이스와,하지만 추상 클래스와 함께이 작업을 수행 할 수있을 것 같아요

public class Sheet { 
    private InterfaceMap m = new OurSheetMatrix(); 
    ... 
} 

: 우리는 같은 다른 클래스 Sheet에 뭔가를 할 수 있습니다. 그러나 지금, 나는 확실하지 않다.

+4

시도하지 않았습니까? – home

답변

1

예. OurSheetMatrixis-aInterfaceMap. 그러나 new InterfaceMap();이라고 말할 수는 없습니다. 왜냐하면 instantiate 인터페이스를 직접 사용할 수 없기 때문입니다 (약속을 [또는 더 공식적으로 계약]이라고 생각하는 것이 가장 좋습니다). 추상 클래스는 유사하지만 구별되는 관계입니다. 중요한 것은 관계입니다 (직접 인스턴스화 할 수도 없습니다).

1

네, 당신은 그것을 할 수 있습니다 :

private InterfaceMap m = new OurSheetMatrix(); 

은 OK입니다.

public void doSomething(InterfaceMap iamp) { 
    //Do something with an InterfaceMap. 
    //I don't know (or care) exactly what class it is, 
    //so long as it implements InterfaceMap 
} 

을하지만 더 구체적인 뭔가가있는 경우 : 당신은 또한 방법에 주위에 당신의 인터페이스에 대한 참조를 전달할 수 있습니다

InterfaceMap imap = new OurSheetMatrix(); //this is OK 
doSomethingElse(imap);      //But this? NO! can't do this! 

위에게 :

public void doSomethingElse(OurSheetMatrix matrix) {} 

그것은 다음과 같이 호출 할 수 없습니다 doSomethingElsedoSomethingElseOurSheetMatrix을 원하기 때문에 컴파일되지 않습니다. 우리는 실제로 그것이 OurSheetMatrix이라는 것을 알지만, 그 방법은 알지 못합니다.

모든 OneSheetMatrix 객체도 InterfaceMap의, 그러나 InterfaceMap반드시OneSheetMatrix 개체 수 없습니다, 따라서 doSomethingElse에 대한 호출이 유효하지 않습니다 - InterfaceMap를 구현하는 다른 클래스가있을 수 있습니다.