Das wäre im allereinfachsten Fall eine private Funktion im Objekt, deren Referenz gezielt an die Komponente weitergegeben wird, welche sie dadurch bei Bedarf aufrufen darf. Wer die Referenz nicht hat, darfs auch nicht. Und da die Referenz in der Komponente ebenfalls private bleiben kann, bleibt diese auch hier nach außen geheim.
Ich habe hier gerade nur AS zur Verfügung, aber ich glaube damit wirds klar:
Code: Alles auswählen
public class PLObject{
private var x:Number;//private position
//add a new component to this object
public function registerComponent(component:PLComponent){
component.changePositionX=setPositionX;//register event listener for event "changePositionX"
}
//event handler for event "changePositionX"
private function setPositionX(value:Number){
x=value;
trace("PLObject: position x is set to "+x);//log output
}
}
public class PLComponent{
private var _changePositionX:Function;//event handler for event "changePositionX"
//register a handler function for event "changePositionX"
public function set changePositionX(handler:Function){
_changePositionX=handler;
}
//test changing a private value in parent object
public function updateX(anyValue:Number){
if(_changePositionX)_changePositionX(anyValue);// fire event "changePositionX" if it has a handler
}
}
//test it!
var myObject:PLObject=new PLObject();
var myComponent:PLComponent=new PLComponent();
myObject.registerComponent(myComponent);//add component to object
myComponent.updateX(15);// --> "PLObject: position x is set to 15"
//other ways to acces the PLObject property "x" will fail:
//myObject.x=8;//error
//myObject.setPositionX(8);//error
//myComponent.changePositionX(8);//error