Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现
前言:
Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多;
学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子;
Golang 中的 面向对象
什么是面向对象?
- 面向对象是一种编程思想, 并不是某一种开发语言独属;
那什么是对象?
- 对象,指的是客体。所谓客体是指客观存在的对象实体和主观抽象的概念。(扩展阅读)
- 简单理解就是, 抽象一个拥有多重属性的客体, 将共有属性抽离出来为一个类, 以便实现定义多个客体的功能。
面向对象有哪些特征?
- 面向对象 通常包括三个特征 继承, 封装 和 多态; (简单理解)
- 继承: 由子类继承父类的属性/数据/方法等;
- 封装: 以最简单的函数形式将方法展示出去, 而不需要使用者知道方法内有什么、由什么实现, 类似黑盒子, 只需知道怎么用, 毋需知道为什么;例如, 电动车充电器, 只需知道插上两边的插头, 而不需要去理解如何变压限流;
- 在Go语言中, 通常使用接口的方式完成封装;
- 多态: 一种方法的多种表现形式, 可以看作是封装后的方法的集合, 根据使用场景, 自动分发到某具体方法中; 即一个同样的函数对于不同的对象可以具有不同的实现。
- 面向对象 通常包括三个特征 继承, 封装 和 多态; (简单理解)
为什么使用面向对象?
面向对象是为了解决系统的可维护性,可扩展性,可重用性(详细资料)
- 简单理解: 以对象方法代替过程完成实现, 方便以后修改及复用
Go语言中的面向对象如何实现? 以简单计算器为例

- 抽象类型: 计算器, 可以抽象为 两个数字, 一个运算符和结果返回值;
- 父类: 两个数字
- 子类: 继承父类
- 子类的方法: 做出计算并输出结果返回值
- 定义方法, 对不同的运算符返回不同的运算结果
- 封装: 定义接口, 将子类方法进行封装
- 多态: 定义多态, 并将封装好的接口作为形参, 实现多态; 可以简单理解为 以接口作为形参的函数
- 抽象类型: 计算器, 可以抽象为 两个数字, 一个运算符和结果返回值;
基于面向对象的, Go语言实现简单计算器
1. 分析实现过程, 进行抽象化: 两个数字, 一个运算符, 一个结果返回值
type BaseNum struct {
num1 int
num2 int
} // BaseNum 即为父类型名称
type Add struct {
BaseNum
} //加法子类, 定义加法子类的主要目的, 是为了定义对应子类的方法
type Sub struct {
BaseNum
} //减法子类
2. 定义子类方法, 实现运算及返回值
func (a *Add)Opt()(value int) {
return a.num1 + a.num2
}//加法的方法实现
func (s *Sub)Opt()(value int) {
return s.num1 + s.num2
}//减法的方法实现
注意: 这里的方法名称是一样的, 这样才能使用接口进行归纳;
3. 封装, 定义接口, 归纳子类方法为 接口
type Opter interface { //接口定义
Opt()int //封装, 归纳子类方法, 注意此处需要加上返回值, 不然没有办法输出返回值(因为方法中使用了返回值)
}
4. 定义多态
func MultiState(o *Opter)(value int) { //多态定义, 可以简单理解为以接口作为形参的函数, 方便学习
value = o.Opt()
return
}
5.主函数及调用
func main(){
var a Add = Add{BaseNum{,}}
//使用Add对象方法
value := a.Opt()
//使用接口
var i Opter
i = &a
value := i.Opt()
//使用多态
i = &a
value := MultiState(i)
//输出测试
fmt.Println(value)
}
至此, 一个单纯的面向对象的 简单计算器完工;
引发的问题思考:
为什么比面向过程复杂的多?是否有意义?
答案是肯定的, 面向对象所拥有的扩展性与维护性是面向过程无法比拟的;
假设我需要在以上加减法计算器上加一个乘法或者除法, 那么我们需要做的工作仅仅是新建一个类和对应的方法就可以了, 其余的事情已经由接口定义下过了;
点滴延伸:
三 面对对象编程,分为几个步骤?
面向对象是一种思想,他让我们在分析和解决问题时,把思维和重点转向现实中的客体中来,然后通过UML工具理清这些客体之间的联系,最后用面向对象的语言实现这种客体以及客体之间的联系。它分为面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)三个大的步骤。
1、首先是分析需求,先不要思考怎么用程序实现它,先分析需求中稳定不变的客体都是些什么,这些客体之间的关系是什么。
2、把第一步分析出来的需求,通过进一步扩充模型,变成可实现的、符合成本的、模块化的、低耦合高内聚的模型。
3、使用面向对象的实现模型
摘自http://www.cnblogs.com/seesea125/archive/2012/04/20/2458940.html
在上面的实例中, 我们提到了运算符, 并将运算符与输入值和输出值并列在一块, 这是为什么呢?
因为我们可以通过实现模型来完成更加简洁的写法:
下面实例使用工厂模式来解决计算器的问题:
package main import "fmt" /*
实例: 面向对象的计算器实现 1.定义父类
2.定义子类,以及子类的方法 运算实现
3.定义接口, 归纳 子类方法
4.定义空类, 定义空类的方法,即 工厂模式, 将 运算符 与 数值 分开处理, 以运算符来分发方法, 方便调用
5.定义一个多态, 将接口归纳, 方便调用
6.主函数, 初始化, 调用工厂模式, 进行验证 */ //父类
type BaseNum struct {
num1 int
num2 int
} //加法子类
type Add struct {
BaseNum
} //减法子类
type Sub struct {
BaseNum
} //子类方法
func (a *Add)Opt() int {
return a.num1 + a.num2
} func (s *Sub)Opt() int {
return s.num1 - s.num2
} //定义接口, 即封装 type Opter interface {
Opt() int
} //定义多态
func MultiState(o Opter) int{
value:=o.Opt()
return value
} //定义空类 以产生 工厂模式 的方法
type Factory struct { } //⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️
func (f *Factory)FacMethod(a,b int,operator string) (value int){
var i Opter
switch operator {
case "+":
var AddNum Add = Add{BaseNum{a,b}}
i = &AddNum
case "-":
var SubNum Sub = Sub{BaseNum{a,b}}
i = &SubNum
}
//接口实现 : value = i.Opt()
value = MultiState(i) //多态实现
return
} //⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️ func main() {
var a Factory
value := a.FacMethod(,,"-")
fmt.Println(value)
}
上面的代码中, 我们看到 Factory 部分, 先定义了一个空类以完成对平级方法的调用, 而后定义了一个方法;
此方法代替了主函数中每次调用前的初始化操作, 而且, 在主函数中, 也完全不需要知道其中的实现过程;
基于本实例的简单分析, 及对Golang面向对象简单图示:


小结:
至此, 关于Golang中的面向对象有了一个基础的认识, 但是对于面向对象本身还是需要多加巩固和练习;
学习是为了写代码, 不多写代码怎么学习;
Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现的更多相关文章
- 【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
一.简介 Lua是一门非常强大.非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言.但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是 ...
- 【转载】【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
[游戏开发]在Lua中实现面向对象特性——模拟类.继承.多态 阅读目录 一.简介 二.前提知识 三.Lua中实现类.继承.多态 四.总结 回到顶部 一.简介 Lua是一门非常强大.非常灵活的脚本语 ...
- 2019-7-29-C#-在基类定义好方法让子类继承接口就能实现
title author date CreateTime categories C# 在基类定义好方法让子类继承接口就能实现 lindexi 2019-07-29 09:57:49 +0800 201 ...
- Java面向对象-Java类的继承及super关键字
Java面向对象-Java类的继承 1,继承定义以及基本使用 定义:子类能够继承父类的属性和方法: 注意点:Java中只支持单继承: 私有方法不能继承: 上代码: package com.java12 ...
- php面向对象:类的继承实例讲解
什么是类的继承?说白了,我觉得就是提高代码使用效率的.下面我就给大家介绍下继承.大理石平台维修 类的继承概念 子类继承父类的所有成员变量个方法,包括构造方法,当子类被实例化时,php会现在子类中查询构 ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- Java第四次作业,面向对象高级特性(继承和多态)
Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...
- Java第四次作业—面向对象高级特性(继承和多态)
Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...
- 【JAVA零基础入门系列】Day13 Java类的继承与多态
继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...
随机推荐
- dos命令,jdk&jre&jvm的关系,classpath和path区别
Day01_SHJavaTraing_4-2-2017 一.学习方法 1.独立思考 2.独立整理.总结知识点 3.整理Exception报错文档 4.莫钻牛角尖 5.敲代码,敲,猛敲,死里敲 6.写代 ...
- leetcode525. 连续数组 python
给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组. 示例 1: 输入: [0,1] 输出: 2 说明: [0, 1] 是具有相同数量0和1的最长连续子数组. 示例 2: 输入: ...
- webpack安装,npm WARN optional SKIPPING OPTIONAL DEPENDENCY,npm WARN notsup SKIPPING OPTIONAL DEPENDENCY警告
npm install webpack -g//全局安装webpack 电脑上安装完后: 其中有两个警告: npm WARN optional SKIPPING OPTIONAL DEPENDENCY ...
- 使用highcharts动态绘制折线图——so easy
之前学习highcharts发现网上的教程大部分是对highcharts数据的注释,如何动态绘制数据大部分一笔带过,让那些初涉开发的小白云里雾里,所以我就写了一篇这样的博客. <html> ...
- PAT 天梯赛练习集 L2-016. 愿天下有情人都是失散多年的兄妹
题目链接:https://www.patest.cn/contests/gplt/L2-016 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母. ...
- python的迭代器、生成器、三元运算、列表解析、生成器表达式
一 迭代的概念 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前 ...
- 如何解决zabbix中自定义监控mysql因密码造成的 Warning
1.--show-warnings=false 在指定mysql命令获取参数时,指定不获取 Warning.不过亲测这个方法不是很有效 例如: mysql -uroot -p123 --show-wa ...
- swoole 清除定时器提示no timer
首页确定一个核心概念 clearTimer仅可清除当前进程的定时器 server代码如下: <?php class Server { private $serv; private $timer; ...
- 【转】python 关键字
转自:http://www.cnblogs.com/hongten/p/hongten_python_keywords.html python3.3.2中的关键字如下: The following i ...
- POJ2142 The Balance (扩展欧几里德)
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia The Balance 题目大意 你有一个天平(天平左右两边都可以放砝码)与重量为a,b(1<= ...