Originariamente inviato da and80
in AS ancora non c'è un modo di rendere dei parametri come opzionali
e visto l'andazzo mai ci sarà ... più facile che AS3.0 implementi finalmente l'overload di metodi.

Come funziona l'overload ?

Visto che avete tirato in ballo il php, che non supporta nemmeno lui overload, vediamo l'esempio in php:
codice:
class Test {
	function scriviQUalcosa($testo = "qualcosa") {
		echo $testo;
	}
}
Questa semplice classe con il suo semplice metodo fanno un'operazione banale per che conosce il php (o il python) ma di fatto è un modo diverso di utilizzare un overload.

Java e .NET parlando, nonchè probabilmente AS3.0, è come se avessimo fatto una cosa tipo questa (rappresentata in AS2.0)
codice:
class Test {
	public function scriviQUalcosa(Void):Void {
		trace("qualcosa");
	}
	public function scriviQUalcosa(testo:String):Void {
		trace(testo);
	}
}
il metodo scriviQualcosa viene definito più di una volta (overload del metodo) e serve ad indicare quale versione dei due usare qualora il parametro sia stato inviato come stringa oppure no.

La naturale conseguenza delle possibilità di overload è questa
codice:
class Test {
	public function scriviQUalcosa(Void):Void {
		trace("qualcosa");
	}
	public function scriviQUalcosa(testo:String):Void {
		trace(testo);
	}
	public function scriviQUalcosa(quanteVolte:Number, testo:String):Void {
		for(var i:Number = 0; i < quanteVolte; i++)
			trace(testo);
	}
	public function scriviQUalcosa(testo:String, uppercase:Boolean):Void {
		if(uppercase)
			testo = testo.toUpperCase();
		trace(testo);
	}
}
Ovvero a seconda di come verrà richiamato il metodo avremo risultati differenti.
codice:
var test = new Test;
test.scriviQUalcosa(); 			// qualcosa
test.scriviQUalcosa("ciao"); 		// ciao
test.scriviQUalcosa(2, "ciao");		// ciao ciao
test.scriviQUalcosa("ciao", true);	// CIAO
test.scriviQUalcosa("ciao", false);	// ciao

Come faccio in AS1.0 (quindi anche in AS2.0) a fare qualcosa di simile ? Sfruttando arguments
codice:
function overLoad() {
	trace(arguments.length);
}

overLoad();
overLoad("test");
overLoad(1, true);
overLoad("a", ["b", "c"], d);
Ovvero a seconda del tipo di parametri inviati e del totale di essi è possibile comportarsi in modo differente.
Qualcosa tipo questo:
codice:
class Test {
	public function scriviQUalcosa(Void):Void {
		var	i:Number = arguments.length;
		if(i === 0)
			trace("qualcosa");
		else {
			if(i === 1)
				trace(arguments[0]);
			else if(i === 2) {
				if(typeof(arguments[0]) === "number") {
					for(i = 0; i < arguments[0]; i++)
						trace(arguments[1]);
				}
				else if(typeof(arguments[1]) === "boolean") {
					if(arguments[1])
						arguments[0] = arguments[0].toUpperCase();
					trace(arguments[0]);
				}
			}
		}
	}
}
che seppur orribile è la "brutta copia" della versione col metodo ed i suoi 4 overloads vista più sopra




[edit]
tecnicamente parlando anche il php ha una funzione per lavorare "in arguments" ... per l'appunto
codice:
func_get_args(); 	=> 	arguments
func_num_args(); 	=> 	arguments.length
func_get_arg($i); 	=> 	arguments[i]