2011-03-22 5 views
0

머리 중심 디자인 패턴을 읽고 Java를 이해하고 있습니다. 클래스에서 다른 것을 캡슐화하고 서브 클래스에 해당 기능을 넣는 대신 별도의 인터페이스에 넣는 것으로 시작합니다. 그들이 제공하는 예제는 오리에 따라 돌팔이 나 날 수있는 추상 오리 클래스입니다. 그들은 quack and fly (QuackBehavior와 FlyBehavior 인터페이스)를위한 인터페이스를 가지고 있고, 그런 다음 그 인터페이스를 다른 클래스에 구현합니다. 내가 무엇을 나에게 새로운 것은 인터페이스 유형이다 인스턴스 변수를 가진 것 같다Java의 동작 인터페이스 유형에 대한 참조 변수

public abstract class Duck { 
    QuackBehavior quackBehavior; 
    FlyBehavior flyBehavior; 
..... 
} 

을 다음과 같이 예에서

, 그들은 추상적 인 오리 클래스가 있습니다. 전에는 배운 적이 없지만 그것이 유효하다고 가정하고 있습니까? 나는 구체적인 클래스의 인스턴스 변수를 갖는 것에 익숙하다고 생각한다. 이 같은 클래스/인터페이스의 인스턴스 변수를 갖는 것에 대한 규칙이 있습니까? 감사.

답변

0

예, 유효합니다. 적용되는 유일한 규칙은 다른 유형에 적용되는 것과 동일합니다. 즉, 선언 된 인터페이스를 구현하는 것만 지정할 수 있습니다. 다음과 같이 이전에 비슷한 구문을 보거나 사용하지 않았을 수도 있습니다.

List<String> list = new ArrayList<String>(); 
Serializable s = new Object(); 
0

필드를 인터페이스 유형으로 선언하면 필드는 인터페이스를 구현하는 모든 클래스를 보유 할 수 있습니다.

정상적인 분야입니다.

2

유효하며 일반적인 관행입니다.

인스턴스 변수가 무엇인지는 중요하지 않습니다. 가능하면 인터페이스를 사용하는 것이 더 좋습니다. 예를 들어 항상 List 유형의 변수를 정의하면 안된다. ArrayList

그렇지 않으면 어떻게 다른 행동을 취할 수 있습니까? 이제 LowFlyBehaviourHighFlyBehaviour을 모두 필드에 할당 할 수 있으므로 Duck의 다른 인스턴스는 다른 비행 행동을 가질 수 있습니다. 필드가 이러한 구체적인 유형 중 하나 였다면 이는 불가능합니다.