141 votes

Accès à un membre de la classe de base

Voir l'exemple d'héritage du terrain de jeu sur le site TypeScript :

class Animal {
  public name;
  constructor(name) {
    this.name = name;
  }
  move(meters) {
    alert(this.name + " moved " + meters + "m.");
  }
}

class Snake extends Animal {
  constructor(name) {
    super(name);
  }
  move() {
    alert("Slithering...");
    super.move(5);
  }
}

class Horse extends Animal {
  constructor(name) {
    super(name);
  }
  move() {
    alert(super.name + " is Galloping...");
    super.move(45);
  }
}

var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);

J'ai modifié une ligne de code : l'alerte dans le fichier Horse.move() . Là, je veux accéder à super.name mais cela ne donne que undefined . IntelliSense me suggère de l'utiliser et TypeScript se compile bien, mais il ne fonctionne pas.

Des idées ?

214voto

Steve Fenton Points 55265

Exemple de travail. Notes ci-dessous.

class Animal {
    constructor(public name) {
    }

    move(meters) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    move() {
        alert(this.name + " is Slithering...");
        super.move(5);
    }
}

class Horse extends Animal {
    move() {
        alert(this.name + " is Galloping...");
        super.move(45);
    }
}

var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);
  1. Vous n'avez pas besoin d'affecter manuellement le nom à une variable publique. Utilisation de public name dans la définition du constructeur le fait pour vous.

  2. Vous n'avez pas besoin d'appeler super(name) des classes spécialisées.

  3. Utilisation de this.name travaux.

Notes sur l'utilisation de super .

Ce sujet est traité plus en détail dans section 4.9.2 de la spécification du langage.

Le comportement des classes héritant de Animal n'est pas différent du comportement dans d'autres langues. Vous devez spécifier le super afin d'éviter toute confusion entre une fonction spécialisée et la fonction de la classe de base. Par exemple, si vous avez appelé move() o this.move() vous auriez affaire à des spécialistes Snake o Horse donc l'utilisation de la fonction super.move() appelle explicitement la fonction de la classe de base.

Il n'y a pas de confusion de propriétés, puisqu'il s'agit des propriétés de l'instance. Il n'y a pas de différence entre super.name y this.name - il y a simplement this.name . Sinon, vous pourriez créer un cheval qui aurait des noms différents selon que vous êtes dans la classe spécialisée ou dans la classe de base.

9voto

Vous utilisez incorrectement le super y this mot-clé. Voici un exemple de leur fonctionnement :

class Animal {
    public name: string;
    constructor(name: string) { 
        this.name = name;
    }
    move(meters: number) {
        console.log(this.name + " moved " + meters + "m.");
    }
}

class Horse extends Animal {
    move() {
        console.log(super.name + " is Galloping...");
        console.log(this.name + " is Galloping...");
        super.move(45);
    }
}

var tom: Animal = new Horse("Tommy the Palomino");

Animal.prototype.name = 'horseee'; 

tom.move(34);
// Outputs:

// horseee is Galloping...
// Tommy the Palomino is Galloping...
// Tommy the Palomino moved 45m.

Explication :

  1. Le premier journal produit super.name il s'agit de la chaîne des prototypes de l'objet tom et non l'objet tom soi. Parce que nous avons ajouté une propriété de nom sur le Animal.prototype le cheval sera édité.
  2. Le deuxième journal produit this.name le this Le mot clé fait référence à l'objet tom lui-même.
  3. Le troisième journal est enregistré en utilisant l'option move de la classe de base Animal. Cette méthode est appelée depuis la méthode move de la classe Horse avec la syntaxe super.move(45); . Utilisation du super Dans ce contexte, le mot clé recherchera un move sur la chaîne du prototype qui se trouve sur le prototype de l'animal.

Rappelez-vous que TS utilise toujours des prototypes sous le capot et que le class y extends Les mots-clés ne sont que du sucre syntaxique sur l'héritage prototypique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X