面向对象
OO是一个很庞大的话题,其实不是三言两语可以搞定的。但是不妨碍我们先进行一个简单的总结:
a. 数据封装: 很简单,就是所有的对象都有属于自己的属性或者成员,而不是依赖于成员变量或者其他局部变量。对于golang来说,就是成言变量和成员方法
b. 继承:直接继承父类的方法或者属性,golang依靠struct的嵌套实现继承,接口也可以继承?应该是吧
c. 多态:
- 多重继承:一个子类可以同时继承多个父类(理解得不是很清晰)
- 多态效果:父类指针可以调用子类的具体方法(写个例子出来?)
- 多态产生的要素:有interface的接口,并且有接口定义的方法;有子类去重写interface的接口;有父类的指针指向子类的具体对象
正在使用的例子
例子1
package redis
import ...
type RedisClient struct {
r *redis.Client
logger logr.Logger
}
func NewRedisClient(r *redis.Client, logger logr.Logger) *RedisClient {
return &RedisClient{
r,
logger,
}
}
func (c *RedisClient) SetOrUpdateAlarmCode() (bool, error) {
return false, nil
}
func(c *RedisClient)SetOrUpdateTestCode() (bool, error) {
return true, nil
}
package bupt
import ...
type RepositoryRedis interface {
SetOrUpdateAlarmCode() (bool, error)
}
func BuptServerPool(redisClient Repository) {
redisClient.SetOrUpdateAlarmCode()
fmt.Println("bupt")
}
package hkust
import ...
type RepositoryRedis interface {
SetOrUpdateTestCode() (bool, error)
}
func HkustServerPool(redisClient Repository) {
redisClient.SetOrUpdateAlarmCode()
fmt.Println("bupt")
}
package main
import ...
var redisClient *redis.RedisClient
func main() {
...
redisClient = redis.NewRedisClient(rds, logger)
go bupt.BuptServerPool(redisClient)
go hkust.HkustServerPool(redisClient)
}
// 1. 这里使用的多重继承,子类redisClient分别实现了bupt.RepositoryRedis和hkust.RepositoryRedis的接口
// 2. 但是这里貌似没有产生多态?
// 3. 不同的package中定义不同redis接口,符合最小测试原则?我也不知道是什么意思?没有用过