Как вызвать методы базового класса в машинописи - PullRequest
0 голосов
/ 17 апреля 2019

Я ожидал, что он вызовет метод класса Animal, а не Snake.

Что на самом деле происходит, когда я делаю кастинг? typescript <Class>object


class Animal {
    name: string;
    constructor(theName: string) {
        this.name = theName;
        this.toString();
        console.log(`\tis Animal?: ${this instanceof Animal}`);
        console.log(`\tis Snake?:  ${this instanceof Snake}`);
        console.log(`\tis Horse?:  ${this instanceof Horse}`);
        console.log()
    }

    toString() {
        console.log(`My name is ${this.name} and I'm a animal`);
    }
}

class Snake extends Animal {
    name: string;

    constructor(nameAnimal: string, nameSnake: string) {
        super(nameAnimal);
        this.name = nameSnake;
    }

    toString() {
        console.log(`My name is ${this.name} and I'm a snake`);
    }
}

class Horse extends Animal {
    constructor(name: string) {
        super(name);
    }
}

// create my objects
let sammy = new Snake('Sammy the Python', 'sssssamy');
let tommy: Animal = new Horse('Tommy the Palomino');


// using method of snake
sammy.toString();

// casting 
const animal: Animal = (<Animal>sammy); // or const animal: Animal =  sammy as Animal;

// using method of animal
animal.toString()

EDIT: фиксированный выход Выход:

My name is Sammy the Python and I'm a snake
        is Animal?: true
        is Snake?:  true
        is Horse?:  false

My name is Tommy the Palomino and I'm a animal
        is Animal?: true
        is Snake?:  false
        is Horse?:  true

My name is sssssamy and I'm a snake 

My name is sssssamy and I'm a snake

В каком случае мне не нужно было бы печатать Меня зовут Ссссамы, а я животное? Я думаю, что метод перегрузки, и методы в базе должны быть вызваны, потому что я использовал приведение в змею.

1 Ответ

0 голосов
/ 17 апреля 2019

Это не очень естественная вещь в JS.Концептуально все, так сказать, 1001.Я не знаю эквивалента чему-то вроде new скрывающего переопределения в C #.JS использует прототипы для наследования.Здесь слишком много информации, но вы можете прочитать об этом больше в этой статье: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

Один из подходов, о котором я могу подумать, будет ...

Animal.prototype.toString.call(sammy);

, что должно привести к:

My name is Sammy the Python and I'm a animal
...