所以我在下面有以下内容。我如何在调用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
答案 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