Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    ereditarietà e classe base

    ciao , ho le seguenti due classi:
    codice:
    
    function Effect( vertexShader, fragmentShader, m_gl) {
        
        this.shaderProgram;
        this.m_arayConstantsShader;
        this.SemanticInVertexBuffer;
        this.MatrixConstants;
        this.LightConstants;
        this.program;
        this.ShaderProgram;
       
        var cfragmentShader = this.GetShader(fragmentShader);
        var cvertexShader = this.GetShader(vertexShader);
        
        this.ShaderProgram = m_gl.createProgram();
        
        m_gl.attachShader(this.ShaderProgram, cvertexShader);
        m_gl.attachShader(this.ShaderProgram, cfragmentShader);
        m_gl.linkProgram(this.ShaderProgram);
    
        if (!m_gl.getProgramParameter(this.ShaderProgram, m_gl.LINK_STATUS)) {
            alert("errore inizializzazione shader");
        }
    
        
    
        
    };
    codice:
    function MyEffect(vertexShader, fragmentShader, m_gl) {
        
        this._super(vertexShader, fragmentShader, m_gl);
    
    }
    
    
    MyEffect.prototype = new Effect();
    MyEffect.prototype.constructor = Effect;
    non riesco a chiamare il costruttore della classe base, mi da un errore la funzione:
    this._super(vertexShader, fragmentShader, m_gl);

    come si fa?

    grazie.

  2. #2
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Per forza ti dà errore, non gli passi gli argomenti richiesti da Effect… Prova a spostare l'assegnazione del prototipo all'inerno del costruttore e a passargli gli argomenti, così:

    codice:
    function Effect( vertexShader, fragmentShader, m_gl) {
    	// blablabla
    }
    
    function MyEffect(vertexShader, fragmentShader, m_gl) {
    	this._super(vertexShader, fragmentShader, m_gl);
    	this.prototype = new Effect(vertexShader, fragmentShader, m_gl);
    }
    
    // MyEffect.prototype.constructor = Effect;
    // questo è superfluo, controlla da te!
    // alert(MyEffect.prototype.constructor);
    // piuttosto di solito, quando si modifica il prototipo, si reimposta il costruttore originale, così:
    MyEffect.prototype.constructor = MyEffect;
    P.S. Lo so che il concetto è molto simile alle classi, ma non le chiamare classi, in javascript si chiamano costruttori!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie come sempre,
    purtroppo in ff 5 mi da quest'errore:

    Errore: this._super is not a function
    File sorgente: /Projects/WebApplication/MyEffect.js
    Riga: 3


    il mio codice:
    codice:
    function MyEffect(vertexShader, fragmentShader, m_gl) {
    
        this._super(vertexShader, fragmentShader, m_gl);
        this.prototype = new Effect(vertexShader, fragmentShader, m_gl);
     
       this.SemanticInVertexBuffer = { "position": "aVertexPosition", "normal": "aVertexNormal" };
       this.MatrixConstants = { "MV_MATRIX": "uMVMatrix", "P_MATRIX": "uPMatrix", "N_MATRIX": "uNMatrix" }
       this.LightConstants = { "LIGHT0_DIRECTION": "uLightingDirection", "LIGHT1_DIRECTION": "uLightingDirection2" }
    
    }
    
    
    MyEffect.prototype.constructor = MyEffect;
    scusa ma non riesco a capire dove sbaglio??

    ciao

  4. #4
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Prova a invertire le prime due righe di codice del costruttore, così:

    codice:
    function MyEffect(vertexShader, fragmentShader, m_gl) {
    
        this.prototype = new Effect(vertexShader, fragmentShader, m_gl);
        this._super(vertexShader, fragmentShader, m_gl);
     
       this.SemanticInVertexBuffer = { "position": "aVertexPosition", "normal": "aVertexNormal" };
       this.MatrixConstants = { "MV_MATRIX": "uMVMatrix", "P_MATRIX": "uPMatrix", "N_MATRIX": "uNMatrix" }
       this.LightConstants = { "LIGHT0_DIRECTION": "uLightingDirection", "LIGHT1_DIRECTION": "uLightingDirection2" }
    
    }
    
    
    MyEffect.prototype.constructor = MyEffect;
    In ogni caso nel codice che hai postato la funzione _super non esiste. Mi auguro che tu l'abbia dichiarata da qualche altra parte con (My)Effect.prototype._super = function() { // blablabla };!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    scusa , cappella mia , non ho capito pero' bene
    1)a cosa serve super e perchè crearla
    2)come richiamo le funzioni della classe base, forse super serve a questo?

    grazie.

  6. #6
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Che ne so io a che serve. Sei tu che richiami la funzione _super in questa riga:

    codice:
    this._super(vertexShader, fragmentShader, m_gl);

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    scusami ma cercando in google ho trovato un esempio che pensavo fosse corretto.
    ti volevo chiedere 2 cose:
    1)la visibilità delle variabili : se utilizzo una variabile this.Program nel costruttore base e richiamo il costruttore come accedo correttamente a quella variabile da un prototipo derivato?
    2)come richiamare una funzione di un prototipo base da cui eredito?

    grazie.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    pardon, non usavo
    nomeoggetto.prototype.funzione
    solo
    nomeoggetto.funzione


    è cosi che bisogna fare?

  9. #9
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Aspetta, nella fretta ti avevo detto qualche fregnaccia prima. L'assegnazione del prototipo la devi fare fuori dal costruttore, se la fai dentro non ti funzionerà... sorry, capita a tutti di sbagliare...

    Originariamente inviato da giuseppe500
    scusami ma cercando in google ho trovato un esempio che pensavo fosse corretto.
    ti volevo chiedere 2 cose:
    1)la visibilità delle variabili : se utilizzo una variabile this.Program nel costruttore base e richiamo il costruttore come accedo correttamente a quella variabile da un prototipo derivato?
    2)come richiamare una funzione di un prototipo base da cui eredito?

    grazie.
    Ti faccio qualche esempio:

    codice:
    // questa e' la classe base
    function Veicolo (sTipo) {
    	this.tipo = sTipo;
    }
    
    // questa e' una classe derivata
    function Automobile (sModello, sVelocMax) {
    	this.modello = sModello;
    	this.velocita = sVelocMax;
    }
    
    Automobile.prototype = new Veicolo("Automobile");
    Automobile.prototype.constructor = Automobile;
    
    // questa e' una classe derivata
    function Aereo (sModello, sVelocMax, sAltitudine) {
    	this.modello = sModello;
    	this.velocita = sVelocMax;
    	this.altitudine = sAltitudine;
    }
    
    Aereo.prototype = new Veicolo("Aereo");
    Aereo.prototype.constructor = Aereo;
    
    // adesso proviamo...
    var miaAuto = new Automobile("FIAT 500", "80 km/h");
    alert(miaAuto.tipo); // velocita' fa parte del costruttore base
    alert(miaAuto.velocita); // velocita' fa parte del costruttore figlio
    // si accede allo stesso modo!!
    
    // adesso invece guarda qua cosa faccio...
    
    // questa e' una classe derivata
    function Motociclo (sModello, sVelocMax) {
    	this.modello = sModello;
    	this.velocita = sVelocMax;
    }
    
    // questa e' una classe derivata
    function Ciclomotore (sModello, sVelocMax) {
    	this.modello = sModello;
    	this.velocita = sVelocMax;
    }
    
    // adesso assegno sia a Motociclo che a Ciclomotore lo stesso prototipo
    var oDueRuotePr = new Veicolo("Due ruote");
    Motociclo.prototype = oDueRuotePr;
    Ciclomotore.prototype = oDueRuotePr;
    Motociclo.prototype.constructor = Motociclo;
    Ciclomotore.prototype.constructor = Ciclomotore;
    
    // e guarda cosa succede...
    Ciclomotore.prototype.tipo = "Motocicletta";
    alert(Motociclo.prototype.tipo); // "Motocicletta"
    
    
    
    // se invece faccio così sto assegnando, a dispetto delle apparenze, due prototipi diversi; spero tu abbia capito il perché...
    Motociclo.prototype = new Veicolo("Due ruote");
    Ciclomotore.prototype = new Veicolo("Due ruote");
    
    // e guarda cosa succede...
    Ciclomotore.prototype.tipo = "Motocicletta";
    alert(Motociclo.prototype.tipo); // rimane sempre "Due ruote"
    Se hai tempo dai una sbirciata qua:
    http://sviluppare-in-rete.blogspot.c...totype-ed.html


  10. #10
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    No, aspetta, quest'altra guida è FENOMENALE!!! Devi assolutamente leggerla!

    http://developer.mozilla.org/en/Core...ased_Languages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.