面向对象

OO是一个很庞大的话题,其实不是三言两语可以搞定的。但是不妨碍我们先进行一个简单的总结:
a. 数据封装: 很简单,就是所有的对象都有属于自己的属性或者成员,而不是依赖于成员变量或者其他局部变量。对于golang来说,就是成言变量和成员方法
b. 继承:直接继承父类的方法或者属性,golang依靠struct的嵌套实现继承,接口也可以继承?应该是吧
c. 多态:

  1. 多重继承:一个子类可以同时继承多个父类(理解得不是很清晰)
  2. 多态效果:父类指针可以调用子类的具体方法(写个例子出来?)
  3. 多态产生的要素:有interface的接口,并且有接口定义的方法;有子类去重写interface的接口;有父类的指针指向子类的具体对象

正在使用的例子

例子1

  1. package redis
  2. import ...
  3. type RedisClient struct {
  4. r *redis.Client
  5. logger logr.Logger
  6. }
  7. func NewRedisClient(r *redis.Client, logger logr.Logger) *RedisClient {
  8. return &RedisClient{
  9. r,
  10. logger,
  11. }
  12. }
  13. func (c *RedisClient) SetOrUpdateAlarmCode() (bool, error) {
  14. return false, nil
  15. }
  16. funcc *RedisClientSetOrUpdateTestCode() (bool, error) {
  17. return true, nil
  18. }
  1. package bupt
  2. import ...
  3. type RepositoryRedis interface {
  4. SetOrUpdateAlarmCode() (bool, error)
  5. }
  6. func BuptServerPool(redisClient Repository) {
  7. redisClient.SetOrUpdateAlarmCode()
  8. fmt.Println("bupt")
  9. }
  1. package hkust
  2. import ...
  3. type RepositoryRedis interface {
  4. SetOrUpdateTestCode() (bool, error)
  5. }
  6. func HkustServerPool(redisClient Repository) {
  7. redisClient.SetOrUpdateAlarmCode()
  8. fmt.Println("bupt")
  9. }
  1. package main
  2. import ...
  3. var redisClient *redis.RedisClient
  4. func main() {
  5. ...
  6. redisClient = redis.NewRedisClient(rds, logger)
  7. go bupt.BuptServerPool(redisClient)
  8. go hkust.HkustServerPool(redisClient)
  9. }
  10. // 1. 这里使用的多重继承,子类redisClient分别实现了bupt.RepositoryRedis和hkust.RepositoryRedis的接口
  11. // 2. 但是这里貌似没有产生多态?
  12. // 3. 不同的package中定义不同redis接口,符合最小测试原则?我也不知道是什么意思?没有用过

例子2