golang 使用记录

最近在学习 golang,在学习和使用过程中的想法,心得会记录在这里,方便以后总结。今天这篇是关于 golang 使用组合实现的面向对象编程的特点。

golang 官网对关于 golang 是不是面向对象语言的回答是: 是, 也不是。golang 使用组合的方式实现了面向对线的编程方式。但是这与其他语言的面向对象有些许出入。记录如下:

我们先看一段 python 编写的代码:

class A:
    def b(self):
        self.c()

    def c(self):
        print("A-----c")

class B(A):
    def c(self):
        print("B-----c")

if __name__ == "__main__":
    b = B()
    b.b()

执行结果:

PS E:\Project\Python> python .\test.py
B-----c

A 类有 b, c 两个方法, 在 b 方法中调用的 c 方法, 打印 A-----c, B 类继承自 A 类, 并重写的 A 中的 c 方法。B 类的实例调用 b 方法时,实际调用的是 B 类中重写过的 c 方法, 因此打印的是 B-----c

再来看一段 golang 代码:

package main

import "fmt"

type A struct {
    name string
}

func (a *A) S() {
    a.P()
}

func (a *A) P() {
    fmt.Printf("A-----P")
}

type B struct {
    A
}

func (a *B) P() {
    fmt.Printf("B-----P")
}

func main() {
    b := &B{A: A{name: "B"}}
    b.S()
}

执行结果:

PS E:\Project\Python> go run .\test.go
A-----P

可以看到, 虽然在 B 类中重写了 P 方法, 但是通过 B 类的实例调动 S 方法的时候实际调用的还是 A 类的 P 方法。
原理尚不知晓,先记录这个结果,慢慢研究,估计与 golang 使用组合实现面向对象编程有关。

Original: https://www.cnblogs.com/fishAndSea/p/16334136.html
Author: 鱼与海
Title: golang 使用记录

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/597082/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球