如何从另一个父类方法调用父类方法

时间:2018-06-20 01:38:02

标签: javascript

所以我在下面有以下内容。我如何在调用rabbit.halfRun();时在Animal.run()而不是Rabbit.run()

中运行代码

class Animal {

  constructor(name) {
    this.speed = 0;
    this.name = name;
  }

  run(speed) {
    this.speed += speed;
    console.log(`${this.name} runs with speed ${this.speed}.`);
  }

  
  halfRun(){
    var newSpeed = this.speed / 2;
    // expect to be run() from Animal class, not Rabbit class
    this.run(newSpeed)
  }

}

class Rabbit extends Animal {

  
  run(speed) {
    var speed = speed * 2;
    super.run(speed);
  }


}

let rabbit = new Rabbit("White Rabbit");

rabbit.run(5); // expect and get 10
rabbit.halfRun(); // expect 5 but I get 20 because it is running the run() from Rabbit

5 个答案:

答案 0 :(得分:0)

获得20分的原因是因为在您的[ { "id": 1, "name": "Rohit", "uri": "assets:/rohit.jpg", "special": "text1" }, { "id": 2, "name": "Anmol", "uri": "assets:/rohit.jpg", "special": "text2" }, { "id": 3, "name": "Bhavya", "uri": "assets:/rohit.jpg", "special": "text3" } ]; 函数中:

import React, {Component} from 'react';
import { StyleSheet, Text, View, Image, ScrollView, Button, TouchableWithoutFeedback, TextInput, AsyncStorage} from 'react-native';
import { createStackNavigator } from 'react-navigation';

import customData1 from './customData.json';

class HomeScreen extends React.Component {
    render() {
        const initialArr = customData1;
        return (
            <View style={styles.container}>
              <ScrollView vertical={true} contentContainerStyle={{flexGrow: 1}}>
              <Text style={styles.category}>Category 1</Text>


              <ScrollView horizontal={true} showsHorizontalScrollIndicator={false}>
                  <TouchableWithoutFeedback onPress={() => {
                        this.props.navigation.navigate('Details', {});
                  }}>
                  <View style={styles.view}>

                      {initialArr.map((prop, key) => {
                        return (
                            <View style={styles.container}>
                          <Image source={{uri: {prop.uri}}} style={styles.image}></Image>
                          <Text key={key}>{prop.uri}</Text>
                          </View>
                        );
                     })}
                  </View>
                  </TouchableWithoutFeedback>
                  </ScrollView>



              </ScrollView>
            </View>
        )
    }
}

由于您正在调用halfRun,因此您正在调用function halfRun(){ var newSpeed = this.speed / 2; this.run(newSpeed); } ,它是指Rabbit类的run方法而不是动物方法。因此,由于它已被覆盖,因此它将调用this.run(newSpeed)的Rabbit类的实现

此外,我认为您设置的HalfRun()函数错误,因为尽管速度减半,但仍将其添加到当前速度值中。

要解决您的问题,您只需在半运行功能中设置速度即可:

rabbit.halfRun()

答案 1 :(得分:0)

因为Halfrun同时调用了这两种方法.rabbit类的'run'方法将其乘以2,然后Rabbit类的'run'正在运行animal类的super run。因此这两种运行方法都在起作用。

答案 2 :(得分:0)

问题类似于

调用rabbit.run()时,速度变量将保留值10并进行打印

速度= 10

当调用rabbit.halfRun()时,它将值除以2,这意味着10/2为5,这应该是预期的输出

在方法结束之前,您调用了this.run(newSpeed)// this.run(5)

因此它将在Rabbit类中调用run方法

所以速度=速度* 2 // 5 * 2

是10

最后您调用了super.run(speed)// super.run(10)

由于先前执行过rabbit.run(),因此速度保持值为10

所以this.speed = + speed // 10 = + 10得出20

答案 3 :(得分:0)

就像函数重写一样,要在运行时根据其指向的实例确定要调用的实际方法。

所以因为rabbit变量指向class Rabbit的对象,并且class Rabbit上具有覆盖方法run,所以即使您调用halfRun从父类中,其实际上调用了run的{​​{1}}方法。这是因为要调用的实际函数是在运行时基于class Rabbit vairable指向的对象确定的。

所以我认为它的预期结果和它的罚款。

但是是的,然后在Javascript中,我猜想没有像rabbit这样的关键字应该在继承时调用当前类的方法。

答案 4 :(得分:0)

我添加了日志来描述代码,希望您能理解为什么得到20个结果。 这就是你速度的变化,
0-> 5 * 2-> 0 + 10-> 10/2-> 5 * 2-> 10 + 10-> 20

class Animal {

  constructor(name) {
    this.speed = 0;
    this.name = name;
  }

  run(speed) {
    console.log(`Received ${speed} from Rabbit class`);
    console.log(`Adding ${speed} to ${this.speed}`);
    this.speed += speed;
    console.log(`Current speed at run(Animal class): ${this.speed}.`);
  }

  
  halfRun(){
    console.log(`Deviding the current speed ${this.speed} by 2`);
    var newSpeed = this.speed / 2;
    console.log(`New speed passed to Rabbit class ${newSpeed}`);
    this.run(newSpeed)
  }

}

class Rabbit extends Animal {

  
  run(speed) {
    console.log(`Current speed: ${this.speed}`);
    console.log(`Multiplying ${speed} by 2`);
    var speed = speed * 2;
    console.log(`Passing ${speed} to Animal class`);
    super.run(speed);
  }


}

let rabbit = new Rabbit("White Rabbit");

rabbit.run(5); // expect 10
rabbit.halfRun(); // expect 20