Dec 2 2009

Flex i klasy z “wieloma” konstruktorami

Jako, ze AS3 nie umozliwia przeladowania konstruktorow w klasach, malo tego, ukrywa konstruktory klas dziedziczonych, czym bardzo utrudnia tworzenie zlozonych obiektow, postaramy sie to obejsc, metoda “kontrolowany multi injection”.

Zalozmy, ze mamy klase Employee dziedziczaca po Person, ktora chcemy inicjowac na dwa sposoby:

wstrzykiwanie statyczne

public function Employee(name: String, surname: String, reward: uint = 0)
{
	super(name, surname);
	this._reward = reward;
}
...
var employee: Employee = new Employee("Jan", "Kowalski", 100);

wstrzykiwanie obiektowe

public function Employee(person: Object, reward: uint = 0)
{
	super(person.name, person.surname);
	this._reward = reward;
}
...
var employee: Employee = new Employee( { name : "Jan", surname : "Kowalski" }, 100);

Co musimy zrobic aby klasa Employee umozliwiala obydwie metody inicjacji? Przypomnij sobie jak wyglada obiekt Array. Masz? Zrobimy podobnie.

kontrolowany multi injection

public function Employee(...args)
{
	var name: String;
	var surname: String;
	var l: uint = args.length;
	if (l == 1 && (args[0] is Object)) {
		name = args[0].name;
		surname = args[0].surname;
	} else if (l == 2 && (args[0] is String) && (args[1] is String)) {
		name = args[0];
		surname = args[1];
	}
	if (name && surname) {
		super(name, surname);
	} else {
		throw new Error("Invalid arguments.");
	}
}

Czyz to nie “Multiple Constructors”? Prawie profesjonalnie ;)


Zostaw odpowiedz