나는 에 장식한다 (데코레이터 설계 패턴)은 공통 기본 클래스이지만, 내가 필요한 방법은 장식이 보호되어있다. 예를 참조하십시오Java Decorator 패턴 : 보호 된 메소드를 꾸밀 수 있습니까?
public class AbstractActor {
public void act(){...} //Delegates its actions to doAct() based on some internal logic
protected void doAct(){...}
}
서브 클래스는 doAct()를 오버라이드 (override)하기위한 것입니다, 나는 거기에 몇 가지 기능을 주입 할 필요가있다. doAct를 오버라이드 할 수는 있지만 데코레이터 클래스는 데코 레이팅되는 인스턴스의 보호 된 메소드 doAct()에 액세스 할 수 없습니다. 예 :
public class ActorDecorator extends AbstractActor {
AbstractActor decoratedInstance;
public ActorDecorator(AbstractActor decoratedInstance){
this.decoratedInstance = decoratedInstance;
}
protected void doAct(){
//Inject my code
decoratedInstance.doAct(); //Can't call protected method of decoratedInstance
}
//Other decorator methods
}
이 챌린지에 대한 해결책이 있습니까?
여기서 문제는 ToDecorateActor의 인스턴스가 아닌 DecorActor (및 하위 클래스가 여러 개)의 인스턴스를 가지고 있다는 점입니다. 예를 들어, hollywoodActor (HollywoodActor가 AbstractActor를 확장)라고 주어진 경우 새 ActorDecorator (hollywoodActor)를 호출 할 수 없습니다. –
나는이 대답을 좋아하지 않는다. 기본적으로 보호 된 메소드를 공용 메소드로 변경합니다. –
클래스 디자이너가 메서드를 보호 한 상태로 유지하면 해당 메서드는 그대로 유지됩니다. 이 방법으로 캡슐화를 위반하면 모든 사람에게 매우 나쁜 프로그래밍 예제를 설정하고 클래스 소비자에게 더 많은 문제가 발생합니다. – Nilesh