2012-06-19 20 views
6

In C#, abbiamo un concetto sul metodo astratto e su come applicarlo in Javascript. Esempio, ho un esempio:Come applicare la funzione virtuale in javascript

function BaseClass() { 
    this.hello = function() { 
     this.talk(); 
    } 
    this.talk = function() { 
     alert("I'm BaseClass"); 
    } 
}; 

function MyClass() { 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
    BaseClass.call(this); 
}; 

MyClass.prototype = new BaseClass(); 

var a = new MyClass(); 
a.hello();​ 

Come la funzione ciao() in BaseClass chiamare la funzione do() dal MyClass quando l'oggetto è un'istanza di MyClass. Il risultato dell'avviso deve essere "I'm MyClass". Mi aiuti per favore. Grazie.

+2

Penso che intendessimo 'virtuale' /' override', non 'abstract'. – HackedByChinese

+0

Sì, la funzione della base deve essere una funzione virtuale in modo che la classe inherit possa sovrascriverla. –

+0

Non sono sicuro di aver capito. Basta rimuovere 'BaseClass.call (this);' line e funziona, poiché 'this.talk = ...' sovrascrive il metodo base. Oppure puoi avviare 'MyClass' con' BaseClass.call (...) '(all'inizio, non alla fine). Ma se si utilizza 'call', non è necessario definire un prototipo. – freakish

risposta

7

Si potrebbe desiderare di chiamare il costruttore "base" prima:

function MyClass() { 
    BaseClass.call(this); 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
} 

altrimenti BaseClass.talk sovrascriverà MyClass.talk.

Come nota a margine, utilizzare il concetto di "classi" in javascript è piuttosto controproducente, perché non è così che funziona questa lingua. JS utilizza l'ereditarietà prototipale, ovvero, si derivano nuovi oggetti da altri oggetti, non da "classi". Inoltre, ogni funzione in JS è "virtuale" in senso C++, perché il suo puntatore this dipende da come viene chiamata la funzione, non da dove è definita.

4

modo si sostituisce la funzione facendo BaseClass.call(this);

function MyClass() { 
    //BaseClass.call(this); // Not really necessary unless you run code inside your base class 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
}; 

Ciò renderebbe il vostro lavoro codice. Il MyClass.prototype = new BaseClass(); dovrebbe rendere disponibile la funzione ciao sull'oggetto a.

4

Il problema è che si stanno definendo metodi di istanze private, sia nei costruttori MyClass sia in . Ciò ignora la ricerca del metodo prototipo, poiché i metodi talk non si trovano nel prototipo ma sono effettive proprietà dell'istanza e il costruttore viene invocato dopo il costruttore MyClass, sovrascrivendo così la proprietà talk.

Demonstration con ereditarietà del prototipo.

Problemi correlati