美文网首页
Go 语言程序设计——面向对象编程(4)

Go 语言程序设计——面向对象编程(4)

作者: hlemon | 来源:发表于2019-08-11 20:03 被阅读0次

接口(2)

  • 一个非空接口自身并没有什么用处,为了让它发挥作用,我们必须创建一些自定义的类型,其中定义了一些接口所需的方法
  • 两个自定义类型的例子:
type StringPair struct { first, second string }

func (pair *StringPair) Exchange() {
  pair.first, pair.second = pair.second, pair.first
}

type Point [2]int
func (point *Point) Exchange() { point[0], point[1] = point[1], point[0] }
  • 方法的接收者声明为指向其类型的指针,以便我们可以修改调用该方法的(指针所指向的)值
  • 我们完成一个满足签名 String() string 的方法:
func (pair StringPair) String() string {
  return fmt.Sprintf("%q + %q", pair.first, pair.second)
}
  • 通常而言,除了小数据外,我们更倾向于使用指针接收者,因为传指针比传值更高效

接口嵌入

  • 接口可以嵌入其他接口,其效果与在接口中直接被嵌入接口的方法一样,例子:
type LowerCaser interface {
  LowerCase()
}

type UpperCaser interface {
  UpperCase()
}

type LowerUpperCaser interface {
  LowerCaser
  UpperCaser
}
  • LowerCaser 接口声明了一个方法 LowerCase(),它不接受参数,也没有返回值,UpperCaser 接口也类似
  • LowerUpperCaser 接口则将这两个接口嵌套进来,如果要满足它,这需要定义 LowerCase()UpperCase()
  • 嵌入可能看起来没多大的优势,但是如果需要添加两个接口添加额外的方法,例子:
type FixCaser interface {
  FixCase()
}
type ChangeCaser interface {
  LowerUpperCaser
  FixCaser
}
  • 我们可以得到一个分等级的嵌套接口,如图:


    Caser接口、类型和示例图
  • 这些接口并没有多大的用处,我们需要定义具体的类型来实现它们:

func (part *Part) FixCase() {
  part.Name = fixCase(part.Name)
}

func fixCase(s string) string {
  var chars []rune
  upper := true
  for _, char := range s {
    if upper {
      char = unicode.ToUpper(char)
    } else {
      char = unicode.ToLower(char)
    }
    chars = append(chars, char)
    upper = unicode.IsSpace(char) || unicode.Is(unicode.Hyphen, char)
  }
  return string(chars)
}

func (pair *StringPair) UpperCase() {
  pair.first = strings.ToUpper(pair.first)
  pair.second = strings.ToUpper(pair.second)
}

func (pair *StringPair) FixCase() {
  pair.first = fixCase(pair.first)
  pair.second = fixCase(pair.second)
}
  • 接口的灵活性的另一方面是,它们可以在事后创建,例子:
type IsValider interface {
  IsValid() bool
}

if thing, ok := x.(IsValider); ok {
  if !thing.IsValid(){
    reportInvalid(thing)
  } else {
    //...处理有效的thing...
  }
}
  • 创建了接口之后,我们可以检查任意自定义类型看它是否提供 IsValid() bool 方法
  • 接口提供了一种高度抽象的机制,当某些函数或者方法只关心该传入的值能完成使命工作,而不关心该值的实际类型,接口就允许我们声明一个方法的集合

相关文章

  • struct

    面向对象编程 Go支持面向对象编程特性,但和传统面向对象编程是有区别的,Go并不是纯粹的面向对象语言。 Go没有类...

  • Go基础语法(十二)

    面向对象编程 Go 并不是完全面向对象的编程语言。 Go 官网的 FAQ 回答了 Go 是否是面向对象语言,摘录如...

  • 基于对象还是面向对象(二)?

    面向对象程序设计理念 面向对象程序设计并非是面向对象编程语言出现才有的概念,实际上早在这之前人们就在各种编程语言中...

  • 第十六章:Go语言面向对象编程

    1. GO语言OOP概述 Go语言不是纯粹的面向对象的语言,准确是描述是,Go语言支持面向对象编程的特性.Go语言...

  • 2020-03-12

    一. 程序设计语言 二. c++语言的出现背景 三. 面向对象编程 四. 面向对象编程思想 五...

  • go day06 面向对象 匿名组合 方法、方法集、方法

    面向对象 对于面向对象编程的支持Go语言设计的非常简洁而优雅。因为,Go语言并没有沿袭传统的面向对象编程中的诸多概...

  • 类和对象

    1、面向对象程序设计的基本概念 过程是编程语言:程序=算法+数据面向对象编程语言:程序=对象+消息 对象 对象的特...

  • 《软件工程》笔记7

    面向对象的实现 面向对象的程序设计最好还是选用面向对象的编程语言。 良好的程序设计风格对于面向对象实现来说格外重要...

  • 带你手撸万元java进阶课程:jvm基础知识、字节码、类加载器

    编程语言 演化: 机器语言->编程语言->高级语言(java,c++,Go,Rust等) 面向过程--面向对象-面...

  • go语言20小时从入门到精通(八、 面向对象编程)

    8.1 概述 对于面向对象编程的支持Go 语言设计得非常简洁而优雅。因为, Go语言并没有沿袭传统面向对象编程中的...

网友评论

      本文标题:Go 语言程序设计——面向对象编程(4)

      本文链接:https://www.haomeiwen.com/subject/ztfgrctx.html