我要裝飾(裝飾設計模式)一個普通的基類,但我需要的方法裝飾是受保護的。請參閱示例:Java裝飾模式:我可以裝飾受保護的方法嗎?
public class AbstractActor {
public void act(){...} //Delegates its actions to doAct() based on some internal logic
protected void doAct(){...}
}
子類旨在覆蓋doAct(),我需要在其中注入一些功能。我可以重寫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
}
有沒有解決這個問題的方法?
這裏的問題是,我需要裝飾的AbstractActor(和它的衆多的子類)的實例,而不是ToDecorateActor的實例。例如,如果我給出了,hollywoodActor(HollywoodActor擴展了AbstractActor),我無法調用新的ActorDecorator(hollywoodActor)。 – 2011-04-21 10:46:47
我不喜歡這個答案。基本上你正在將受保護的方法改爲公共方法。 – 2011-04-21 10:50:23
當一個類設計師保持一種方法的保護,那麼它應該保持這種方式!如果你以這種方式違反封裝,那麼就是爲每個人設置了非常糟糕的編程示例,並且給類的消費者帶來了更多麻煩。 – Nilesh 2011-04-21 11:50:23