华为仓颉里的struct和class 的关系

208 阅读2分钟

我们做多了高级开发语言,对struct可能还是停留在c/c++,在面向对象语言写的多了,可能把struct结构给忘记了,但是仓颉现在又推出了这个struct,所以我们还是要搞清楚与class的区别,在实际项目中怎么定义struct和class。 首先我们来定义下 struct

package demo
struct StudentStruct{
    var year = 2023
    public static var money:Float32 = 100.0
    // 构造函数 定义了两个成员变量
    public StudentStruct(var name:String,var height:Int16){

    }
    //赋值成员变量
    public mut func makeUp(height:Int16):Unit{
        this.height = height    
    }
}

在来定义class

package demo
class StudentClass <: ToString{
    var year = 2023
    private var name: String
    private var height:Int16

    public mut prop pname:String{
        get(){
            this.name
        }
        set(value){
            this.name = value
        }
    }

    public init(name:String,height:Int16){
        this.name = name
        this.height = height
    }

    public func toString():String {
        return "\n(${this.name},${this.height})"
    }
}


其实看这些代码都很简单,我们在来用main函数测试下这两则的区别

package demo

main(): Int64 {
    println("hello world")

//struct是值类型、class是引用类型  struct不能继承,class可以继承
    let t = StudentStruct("Alan",18)
    var t2 = t 
    t2.year = 2024
    println("${t.year}, ${t2.year}")
    println("${t.name},${t2.height},${StudentStruct.money}")

    let s = StudentClass("Seven",20)
    let s2 = s 
    s2.year = 2024
    println("${s.year}, ${s2.year}")
    println("${s.pname}")
    println("${s.toString()}")
    return 0
}

输出结果

image.png

这里可以看到struct结构体的year值是改变了的,尔对象里的year对象值都改变了, 程序只能有一个main函数 总结下,

  • 1、struct是值类型,不是引用类型,class是引用类型
  • 2、struct 结构可以继承接口,但是不可以继承类或结构,class是面向对象肯定能被继承
  • 3、class 可以使用prop 类似java的多态 getting setting
  • 4、当你实例化一个class,它将创建在堆上。而你实例化一个struct,它将创建在栈上
  • 5、Struct有性能优势,Class有面向对象的扩展优势 ,用于底层数据存储的类型设计为Struct类型,将用于定义应用程序行为的类型设计为Class。如果对类型将来的应用情况不能确定,应该使用Class。

虽然我们可以用(class)类完全代替(struct)结构,但是为了程序的性能的提高,建议大家在实现一个用于存储数据或数据量较小的结构时来使用结构,因为结构是值类型,所以在性能的影响上,是能起到正面作用的。