Re: Datenkapselung
Verfasst: 05.07.2010, 11:58
Leider noch mehr Tipperei und Kopfarbeit, aber eine gute Möglichkeit dass nur die registrierten Komponenten und niemand sonst z.B. an der Objektposition was ändern können, sehe ich im Observer-Pattern: das Objekt registriert einen Listener zum Event "ChangePosition" bei seiner Komponente. Diese löst nur Events aus statt Eigenschaften des Objekts direkt zu beeinflussen. Das Objekt selbst kümmert sich bei gefeuerten Events dann selbst um die Ausführung und ändert seine Eigenschaften, welche dadurch auch private bleiben können.
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:
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