2009-11-24 24 views
5

Lo script di azione viene sviluppato in base alla programmazione orientata agli oggetti, ma perché non supporta l'overloading delle funzioni?perché il sovraccarico non è supportato in Actionscript?

Flex supporta il sovraccarico?

Se sì, spiegare brevemente un esempio reale.

+1

Flex è "solo" un framework .. quindi non offre nient'altro che actionscript 3 – TheHippo

risposta

22

Come dici tu, l'overloading delle funzioni non è supportato in Action Script (e quindi nemmeno in Flex).

Ma le funzioni possono avere parametri di default come qui:

public function DoSomething(a:String='', b:SomeObject=null, c:Number=0):void 

DoSomething può essere chiamato in 4 modi diversi:

DoSomething() 
DoSomething('aString') 
DoSomething('aString', anObject) 
DoSomething('aString', anObject, 123) 

Questo comportamento forse è perché Action Script segue lo standard ECMA Script. Una funzione è infatti una proprietà dell'oggetto, quindi, come se NON POSSIAvi avere due proprietà con lo stesso nome, NON puoi avere due funzioni con lo stesso nome. (Questo è solo un'ipotesi)

Qui è lo standard ECMA-262 (specifica del linguaggio ECMAScript) nella sezione 13 (pagina 83 del file PDF) dice che quando si dichiara una funzione come

function Identifier(arg0, arg1) { 
    // body 
} 

Creare una proprietà dell'oggetto variabile corrente con il nome Identifier e il valore è uguale a un oggetto funzione creata in questo modo:

new Function(arg0, arg1, body) 

Quindi, questo è il motivo per cui non si può sovraccaricare una funzione, perché Non si può avere più di una proprietà dell'oggetto variabile corrente con lo stesso nome

9

Vale la pena notare che la funzione di sovraccarico non è un OOP idioma, è una convenzione linguistica. Le lingue OOP spesso supportano il sovraccarico, ma non è necessario.

Come nota lk, è possibile approssimarlo con la struttura che mostra. Alternativamente, si può fare questo:

public function overloaded(mandatory1: Type, mandatory2: Type, ...rest): *; 

Questa funzione richiederà i primi due argomenti e poi passare il resto come una matrice, che è quindi possibile gestire come necessario. Questo è probabilmente l'approccio più flessibile.

+1

Il parametro ... rest può non solo essere una matrice, anzi può essere un parametro da Zero a N separato da una virgola. (PS: Scusa per il mio scarso inglese) –

+1

Hai ragione, quello che sto dicendo è che all'interno della funzione 'rest' c'è una' Array' dei parametri separati da virgole. –

1

C'è un altro modo: la funzione con qualsiasi parametro restituisce qualcosa.

public function doSomething(...args):*{ 
    if(args.length==1){ 
     if(args[0] is String){ 
      return args[0] as String; 
     } 
     if(args[0] is Number){ 
      return args[0] as Number; 
     } 
    } 
    if(args.length==2){ 
     if(args[0] is Number && args[1] is Number){ 
      return args[0]+args[1]; 
     } 
    } 

} 
+1

Questo è così Anti-OOP :( –

+0

Forse puoi illuminare l'OP come perché, lk? – typeoneerror

+0

è una buona soluzione, se vuoi davvero fare questo – Omu

1

Non si può sovraccaricare, ma è possibile impostare valori di default per gli argomenti che è praticamente la stessa cosa, ma non ti costringono a pianificare i vostri metodi di anticipo a volte.

Il motivo per cui non è probabilmente principalmente un problema di tempo/ritorno sull'investimento per Adobe nella progettazione e nella scrittura della lingua.

1

Probabilmente perché Actionscript ricerca le funzioni in base al nome della funzione in fase di esecuzione, anziché memorizzarle in base al nome e ai parametri in fase di compilazione.

Questa caratteristica lo rende facile aggiungere e rimuovere le funzioni da oggetti dinamici, e la capacità di ottenere e funzioni di chiamata per nome utilizzando object['functionName'](), ma immagino che rende all'attuazione di un sovraccarico molto difficile senza fare danni di quelle caratteristiche.

+1

Mentre questo è vero per AS3, è completamente falso per AS3 (a cui questa domanda si riferisce). Gli oggetti AS3 sono statici e hanno una tabella dei metodi. Gli oggetti Expando sono disponibili solo contrassegnando una classe come "dinamica". L'accesso ritardato ai membri, come il tuo esempio, viene gestito esplicitamente da AVM ma non è l'impostazione predefinita. –

+0

Grazie per l'aggiornamento! Intendevi che AS2 cercasse le funzioni per nome? –

Problemi correlati