2009-07-23 23 views
5

In Actionscript 3 Non posso dichiarare vars nelle interfacce. Non capisco. So che posso lavorare su questo definendo getter e setter, ma cosa succede se voglio solo una semplice proprietà pubblica? Di solito uso getter e setter se c'è qualcosa da fare quando imposto o ottengo una proprietà, ma cosa succede se voglio solo memorizzare un valore?Perché le proprietà non sono dichiarabili nelle interfacce

risposta

0

Non sono una programmazione actioscript, ma le interfacce (in java ad esempio) hanno lo scopo di definire il comportamento non stato, quindi le interfacce in jave dichiarano semplicemente metodi che la classe implementa l'interfaccia deve definire. Le proprietà (o la variabile di istanza) non sono in generale necessarie per definire il comportamento e non sono consentite nelle interfacce.

+0

Proprietà non sono le stesse variabili di istanza. –

+1

+1 su quello ... in linea di principio ... perché questo non è veramente valido per AS3 ... c'è una distinzione tra proprietà (fornite da accessor) e variabili ... dall'esterno questo è completamente trasparente, essendo IDENTICO a livello sintattico ... ma efficacemente l'accesso alle proprietà significa che una chiamata e l'accesso variabile non ... le interfacce possono declare gli accessor delle proprietà, ma non le variabili ... questo non è al 100% coerente né ragionevole ... ma questa è la vita, credo ... :) – back2dos

2

Puoi metterlo in questo modo: le interfacce esistono perché nella tua lingua non puoi ereditare da più classi di base astratte. Se AS3 ti avesse permesso di farlo, probabilmente non avrebbe "interfacce", ma "classi astratte pure".

In altre parole, l'implementazione della proprietà nella interfaccia nella propria interfaccia porterebbe a conflitti di nomi e da lì ad altri problemi di ereditarietà multipli (diamante).

Tuttavia, dovrebbe funzionare solo un getter o un setter senza implementazione.

public interface I { function get A():int; } 

(non ho il compilatore AS3 a portata di mano)

+1

la tua risposta è la soluzione giusta ... anche se sono completamente in disaccordo su ciò che dici delle interfacce ... l'ereditarietà è intrinsecamente cattiva ...: D ... no, sul serio ... il punto l'ereditarietà è CODE REUSE ... ma di solito è abusato per realizzare quali interfacce sono progettate per: descrivere un ruolo degli oggetti ... regola d'oro: le classi definiscono l'implementazione, il comportamento delle interfacce ... non usare le classi per richiedere un comportamento ... non scrivere someMethod (somePa ram: SomeClass), scrivere someMethod (someParam: SomeInterface) ... questo è molto più flessibile/estensibile e più pulito ... – back2dos

+0

Ho cercato di evitare di fare una dichiarazione sull'eredità multipla che è buona o cattiva :) Solo sottolineato che se si dispone dell'implementazione delle proprietà in queste "interfacce", sarebbe necessario un meccanismo simile all'ereditarietà multipla quando il compilatore trova 2 interfacce con la stessa proprietà definita. – Vlagged

Problemi correlati