GO语言中封装,继承,和多态

封装

go中的封装和java的不太一样,在go里面是没有java中的class,不过可以把struct看成一个类,封装可以简单地看作对struct的封装,如下

type obj1 struct {
    valte1 string
}
type obj2 struct {
    valte2 string
}

继承

把struct看做类,struct中可以包含其他的struct,继承内部struct的方法和变量,同时可以重写,代码如下

package main

import "fmt"

type oo struct {
    inner
    ss1 string
    ss2 int
    ss3 bool
}

type inner struct {
    ss4 string
}

func (i *inner) testMethod(){
    fmt.Println("testMethod is called!!!")
}

func main()  {
    oo1 := new(oo)
    fmt.Println("ss4无值:"+oo1.ss4)
    oo1.ss4 = "abc"
    fmt.Println("ss4已赋值"+oo1.ss4)
    oo1.testMethod()//继承调用
    oo1.inner.testMethod()//继承调用 这里也可以重写
}

多态

go中的多台比java的隐匿得多,严格上说没有多态,但可以利用接口进行,对于都实现了同一接口的两种对象,可以进行类似地向上转型,并且在此时可以对方法进行多态路由分发,完全代码如下

package main

import "fmt"

type interfacetest interface {
    //testMothod1() string
    //testMothod()//这种会报语法错误 在go里面是不允许的
    iMethod() //加上int则会报错 说明go的方法判断有返回值,而java没有 
}

type obj1 struct {
    valte1 string
}

type obj2 struct {
    valte2 string
}

//从属不同对象的testMothod 返回值不同的接口实现
func ( obj11 *obj1)iMethod(){
    fmt.Println("testMothod go obj1")
}

//从属不同对象的testMothod 返回值不同的接口实现
func ( obj11 *obj2)iMethod() {
    fmt.Println("testMothod go obj2")
}


func gorun(ii interfacetest){
    fmt.Println(ii.iMethod)
}

func main(){
    var i interfacetest
    //interfacetest_ := new(interfacetest)//这种方式进行多台路由转发会报错 GO需先声明 如 var i interfacetest
    obj1_ := new(obj1)
    //赋obj1
    i = obj1_
    i.iMethod()//正确打印
    gorun(i)
    gorun(obj1_)
    //interfacetest_.testMethod() //这种在java中允许,在go中是不允许的
    //赋obj2
    obj2_ := new(obj2)
    i = obj2_
    i.iMethod()//正确打印
    gorun(i)
    gorun(obj2_)
    list := [2]interfacetest{obj1_,obj2_}

    slice := []interfacetest{}
    slice = append(slice, obj1_)
    slice = append(slice, obj2_)
    for index,value := range slice {
        fmt.Println(index)
        fmt.Println(value)
    }
    fmt.Println(len(slice))

    fmt.Println(len(list))
}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
封装继承多态是面向对象编程的三大特性,C++也支持这三种特性。 1. 封装 封装是指将数据和对数据的操作封装在一起,形成一个类。类的数据和方法可以设置为私有的,只有类内部可以访问,外部无法访问。这样可以保证数据的安全性和完整性。 下面是一个封装的例子: ```c++ class Person { private: string name; int age; public: void setName(string n) { name = n; } void setAge(int a) { age = a; } string getName() { return name; } int getAge() { return age; } }; ``` 2. 继承 继承是指一个类可以继承另一个类的属性和方法。被继承的类称为父类或基类,继承的类称为子类或派生类。子类可以使用父类的属性和方法,也可以重写父类的方法。 下面是一个继承的例子: ```c++ class Student : public Person { private: int id; public: void setId(int i) { id = i; } int getId() { return id; } }; ``` 3. 多态 多态是指同一种类型的对象,在不同的情况下可以有不同的表现形式。C++实现多态有两种方式:虚函数和模板。 下面是一个虚函数的例子: ```c++ class Shape { public: virtual double getArea() { return 0; } }; class Circle : public Shape { private: double radius; public: Circle(double r) { radius = r; } double getArea() { return 3.14 * radius * radius; } }; class Rectangle : public Shape { private: double width; double height; public: Rectangle(double w, double h) { width = w; height = h; } double getArea() { return width * height; } }; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值