作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类似这样的类结构:
interface Composite {}
class Leaf implements Composite { public String val; }
class Node implements Composite {
private Node parent;
private Composite left;
private Composite right;
public void attachLeft(Composite c) {
left = c;
}
public void attachRight(Composite c) {
right = c;
}
public void attachLeft(Node n) {
left = n;
n.parent = this;
}
public void attachRight(Node n) {
right = n;
n.parent = this;
}
public void attachRandomly(Composite c) {
if ( ThreadLocalRandom.current().nextBoolean() ) {
attachRight(c);
} else {
attachLeft(c);
}
}
}
我有一个生成随机树的方法(伪代码):
// build tree
for some number of nodes :
make newNode
oldNode = randomly pick an existing node with an empty right/left
oldNode.attachRandomly(newNode)
// fill leaves of tree
for each node with empty right/left :
while node has empty right/left :
node.attachRandomly(new Leaf)
不幸的是,由于静态绑定(bind),attachLeft/Right(Node c) 方法永远不会被 AttachRandomly 调用。 (attachRandomly 正在获取 Composite,因此始终会调用 AttachLeft/Right 的 Composite 版本。)因此我的父属性永远不会被设置。
现在,我可以想出几种方法来完成这项工作:
选项 1 感觉很糟糕(instanceof!casting!),而选项 2 由于额外的代码量而感觉很尴尬。有没有更好的方法来做到这一点,以便多态性可以发挥作用并帮助我?
最佳答案
你可以这样写。这个基本思想称为双重调度。它为每个方法调用引入了新的分派(dispatch)级别,以允许使用动态绑定(bind)。
interface Composite {
void attachToLeft(Node newParent);
void attachToRight(Node newParent);
}
class Leaf implements Composite {
public String val;
@Override
public void attachToLeft(Node newParent) {
newParent.left = this;
}
@Override
public void attachToRight(Node newParent) {
newParent.right = this;
}
}
class Node implements Composite {
private Node parent;
private Composite left;
private Composite right;
public void attachLeft(Composite c) {
c.attachToLeft(this);
}
public void attachRight(Composite c) {
c.attachToRight(this);
}
@Override
public void attachToLeft(Node newParent) {
this.parent = newParent;
newParent.left = this;
}
@Override
public void attachToRight(Node newParent) {
this.parent = newParent;
newParent.right = this.
}
}
关于Java 静态绑定(bind)使得实现 Composite 变得很尴尬,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48709175/
我想为进入 C# web api 应用程序的一些请求编写一个简单的负载均衡器。 (我只使用 C# 的东西作为创建 Web 服务器的便捷方式)。 解决这个问题的最佳方法是什么? (我还没有真正在 F#
作为一名数据库开发人员,当我尝试将仅数据转储到 PostgreSQL(10.1) 数据库“tlesson”时,我遇到了这个通知。 通知=> pg_dump: NOTICE: there are c
我是一名优秀的程序员,十分优秀!