【发布时间】:2021-03-09 11:23:23
【问题描述】:
我一直在阅读有关多态性的内容,并且对一个 java 示例非常感兴趣,该示例用抽象类替换了长 switch 语句,该抽象类自动选择正确的子类来执行请求的操作。
例如:
// switch version
class Bird {
// ...
getSpeed(): number {
switch (type) {
case EUROPEAN:
return getBaseSpeed();
case AFRICAN:
return getBaseSpeed() - getLoadFactor() * numberOfCoconuts;
case NORWEGIAN_BLUE:
return (isNailed) ? 0 : getBaseSpeed(voltage);
}
throw new Error("Should be unreachable");
}
}
// polymorphism version
abstract class Bird {
// ...
abstract getSpeed(): number;
}
class European extends Bird {
getSpeed(): number {
return getBaseSpeed();
}
}
class African extends Bird {
getSpeed(): number {
return getBaseSpeed() - getLoadFactor() * numberOfCoconuts;
}
}
class NorwegianBlue extends Bird {
getSpeed(): number {
return (isNailed) ? 0 : getBaseSpeed(voltage);
}
}
// Somewhere in client code
let speed = bird.getSpeed();
避免嵌套在类函数中的长 if/else 语句(我知道我可以将此代码封装在不同的函数中以获得更高的可读性,但最终我仍然需要处理许多 if/else)并自动切换到正确的子类会很棒!
如何在Javascript中做到这一点?
我写了类似的东西:
// base
class Bird {
constructor(name){
this.name = name
}
greets() {
switch (this.name) {
case "gull":
return console.log("it's a gull")
case "sparrow":
return console.log("it's a sparrow")
case "dove":
return console.log("it's a dove")
}
}
}
const bird = new Bird("sparrow")
bird.greets()
// output: "it's a sparrow"
// my poor attempt:
class Bird {
constructor(name){
this.name = name
}
greets() {
throw new Error("not implemented");
}
}
class Gull extends Bird {
greets(){
return console.log("it's a gull")
}
}
class Sparrow extends Bird {
greets(){
return console.log("it's a sparrow")
}
}
class Dove extends Bird {
greets(){
return console.log("it's a dove")
}
}
const bird = new Bird("gull")
bird.greets()
// output: Uncaught SyntaxError: Unexpected token '}'
如何用这个简单的鸟类实现多态性?我当然应该为 Dove、Sparrow 和 Gull 扩展 Birds,但我只想在代码中调用 Bird 控制器,因为我不知道最终会得到哪种鸟。
谢谢!
ps:如果有更简单的方法可以通过函数实现这一点,我也很高兴收到您的来信!
【问题讨论】: