该主题的标题并没有完全说明问题的本质,但我不知道如何更好地表述它。
假设我的树既能长樱桃又能长甜樱桃。但由于这是两个不同的类,它们的行为也会有所不同。假设他们有不同的方法。但是尽管这些类有不同的方法,它们仍然需要被调用。
OOP,我理解得很好,模式也是。
我想听听如何按照 OOP 的原则用静态类型的语言最好地解决此类问题。
abstract class АЯгода {
}
class Вишня extends АЯгода {
разбрызгиваетСвойСок() {}
}
class Черешня extends АЯгода {
выстреливаетКосточкой() {}
}
class МоёДерево {
private _ягода: АЯгода;
constructor(ягода: АЯгода) {
this._ягода = ягода;
}
get ягода(): АЯгода {
return this._ягода
}
}
let дерево = new МоёДерево(new Вишня());
if (дерево.ягода instanceof Вишня) {
дерево.ягода.разбрызгиваетСвойСок(); # Здесь всегда будет ошибка.
}
显然不够好。这里已经提出了类似的问题。答案也是一样的:
АЯгода你需要在合约中添加一个新的动作。每个子类都会以自己的方式实现它。例如:另一种选择,一旦你开始类型检查,就是将该字段
ягода转换为一个子类:但是,这种方法与 OOP 是相反的。