Accessing member of base class

后端 未结 2 353
忘了有多久
忘了有多久 2021-01-30 11:52

See the inheritance example from the playground on the TypeScript site:

class Animal {
  public name;
  constructor(name) {
    this.name = name;
  }
  move(mete         


        
2条回答
  •  后悔当初
    2021-01-30 12:56

    Working example. Notes below.

    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. You don't need to manually assign the name to a public variable. Using public name in the constructor definition does this for you.

    2. You don't need to call super(name) from the specialised classes.

    3. Using this.name works.

    Notes on use of super.

    This is covered in more detail in section 4.9.2 of the language specification.

    The behaviour of the classes inheriting from Animal is not dissimilar to the behaviour in other languages. You need to specify the super keyword in order to avoid confusion between a specialised function and the base class function. For example, if you called move() or this.move() you would be dealing with the specialised Snake or Horse function, so using super.move() explicitly calls the base class function.

    There is no confusion of properties, as they are the properties of the instance. There is no difference between super.name and this.name - there is simply this.name. Otherwise you could create a Horse that had different names depending on whether you were in the specialized class or the base class.

提交回复
热议问题