【发布时间】:2020-12-06 17:42:11
【问题描述】:
我是 rust 新手,目前正在重写我的一些旧 Java 代码。这是我第一次不使用 OOP 编程,所以这对我来说既陌生又陌生。
我在理解如何为结构的每个实例实现不同的方法(具有相同的名称)时遇到了一些问题。本质上,我试图在 Java 中实现类似于 abstract Class、extends、@override 的行为。
也许这个例子能更好地解释我到底想要做什么。在其中,我尝试对 AbstractNode 的每个实例实现不同的 execute() 逻辑。
创建一个名为“AbstractNode”的结构,其中包含一些数据并具有与之关联的 3 个方法(validate()、log()、execute())
struct AbstractNode {
pub data: //data here
pub validate: bool,
pub log: String,
}
trait NodeFunctions {
fn validate(&self)->bool{false}
fn log(&self){println!("/")}
fn execute(&self){}
}
impl NodeFunctions for AbstractNode{
fn validate(&self)->bool{
self.validate
}
fn log(&self){
println!("{}/", self.log);
}
fn execute(&self){
//--this function is the problem, because I don't want its behavior to be
//shared between all instances of Abstract node--
}
}
然后我实例化几个节点。 如果可能的话,我还想在这里的某个地方定义 execute() 的主体。
let node1 = AbstractNode{
data: //data
validate: false,
log: "node1".to_string(),
};
let node2 = AbstractNode{
data: //data
validate: 1>0,
log: "node2".to_string(),
};
let node3 = AbstractNode{
data: //data
validate: true,
log: "node3".to_string(),
};
//...
它像这样从 main 调用。如果 validate() 中的条件为真,则首先执行 log() 方法,这对所有节点都是相同的。然后是不是所有节点都相同的execute()。
fn main(){
let mut node_tree = vec![
node1,
node2,
node3
//...
];
for node in node_tree.iter() {
if node.validate(){
node.log();
node.execute(); //<--
break;
}
};
}
每个节点应该能够在 execute() 方法下保存不同的逻辑,我不知道如何定义这个特定的行为。
我希望这个问题足够清楚。如果您不明白我要达到的目标,请提出其他问题。
Ty 提前。
【问题讨论】:
-
我正要说specialization。但是您似乎希望对同一类型的不同实例有不同的实现。一种方法是使用闭包,因此
execute将是Fn/Box<dyn Fn>中的AbstractNode。但是,对于新类型可能会更好,例如struct SomeNode(AbstractNode),然后是impl NodeFunctions。 -
我希望所有节点的类型保持相同。不过,我会更多地研究闭包。泰
-
听起来你在使用 Java 的 匿名类(?)Rust 并没有类似的机制(除了可能使用一些宏魔法)。使用
Fn可能是您想要的最简单的方法。 -
Java 不支持按实例覆盖方法。也许您可以发布您尝试移植的 Java 代码以使您的问题更清楚?
-
嘿,我没有在 Java 中对每个实例进行覆盖,只是使用 'extends' 和 '@override' 将抽象类扩展到新类。我想在 Rust 中创建类似的工作流,每个实例都覆盖。
标签: rust