< 返回版块

duzhaosongyue 发表于 2021-11-18 11:50

Tags:struct

关于struct无法被继承的问题

在java中有A、B两个类型 A为B的父类,那么我可以定义一个函数接受参数A 同时可以传入参数B 代码如下:

/**
 * @author fuping
 */
public class Test {
    public static void p(A1 a1){
        System.out.println(a1.getName());
    }
    public static void main(String[] args) {
        A1 a1 = new A1("A1");
        B1 b1 = new B1("B2");
        p(a1);
        p(b1);
    }
}

class A1 {
    private final String name;

    public A1(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

class B1 extends A1 {
    public B1(String name) {
        super(name);
    }
}

运行的结果是打印A1 B1的名称 这意味着我可以在在这个函数里面使用A1 和B1的属性字段 在面对对象编程里 很多时候非常有用。

在Rust中包含属性字段的struct是无法被继承的,只有trait能被继承但是trait不能包含属性字段,那么就意味着我不能写一个函数来同时处理两个struct的属性字段,必须分别在两个struct 分别实现一次。代码如下:

#[derive(Debug)]
struct M {
    age: i32,
}

#[derive(Debug)]
struct B {
    age: i32,
}

use std::fmt::Debug;

trait C {
    fn be<T>(&self, t: &T) where T: C + Debug;
}


impl C for M {
    fn be<T>(&self, t: &T) where T: C + Debug {
        println!("{:?}", t);
    }
}

impl C for B {
    fn be<T>(&self, t: &T) where T: C + Debug {
        println!("{:?}", t);
    }
}

#[test]
fn m_b_test() {
    let m = M {
        age: 1
    };
    let b = B {
        age: 2
    };
    m.be(&b);
    b.be(&m);
}

在这段代码中我无法在接口实现中获取和操作第二个参数。这个问题是我在写一个小游戏的时候发现的,在游戏中怪物和勇者都有一个攻击操作,我想把这个攻击操作抽象成一个接口可以接受怪物对象也可以接受勇者的对象,实现后发现我无法对对象的属性进行任何操作。作为一个rust的新手我想知道可有什么方法可以实现这个操作。

评论区

写评论
作者 duzhaosongyue 2021-11-20 11:19

懂了

--
👇
paomian: 宏说白了是代码生成,帮助你编写一些重复的代码,不写宏,直接手写也行,但是重复的逻辑可能要重写很多次,就可以提炼出一个宏出来。

--
👇
duzhaosongyue: 这个思路我是理解了,因为刚开始接触rust对于宏还不太能理解,这个地方为什么要用宏有什么好处吗

paomian 2021-11-19 16:58

宏说白了是代码生成,帮助你编写一些重复的代码,不写宏,直接手写也行,但是重复的逻辑可能要重写很多次,就可以提炼出一个宏出来。

--
👇
duzhaosongyue: 这个思路我是理解了,因为刚开始接触rust对于宏还不太能理解,这个地方为什么要用宏有什么好处吗

作者 duzhaosongyue 2021-11-19 09:22

这个思路我是理解了,因为刚开始接触rust对于宏还不太能理解,这个地方为什么要用宏有什么好处吗

作者 duzhaosongyue 2021-11-19 09:10

非常感谢,这个栗子对我很有帮助

--
👇
zhylmzr: 直接在接口中声明setter/getter然后去实现,一个例子:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=fef5a0d0ef50b9256d0224b978f353a9

作者 duzhaosongyue 2021-11-19 08:49

懂了,🙏

作者 duzhaosongyue 2021-11-19 08:48

明白了,🙏

zhylmzr 2021-11-18 16:52

直接在接口中声明setter/getter然后去实现,一个例子:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=fef5a0d0ef50b9256d0224b978f353a9

Grobycn 2021-11-18 14:25

你可以在trait中规定获取属性的方法,然后通过这些方法来获取和修改这些属性。

1 共 8 条评论, 1 页