golang 隐式接口实战以及与 Java 接口的区别


categories: Golang

tags: Golang Java

写在前面

最近在看 go语言学习指南-惯例模式与编程实战, 看到接口那块有点困惑了, 因为之前一直是学 C++的, 对于接口了解的不多, 通过 GPT 补补课.

首先介绍一下接口, 接口其实是针对一组方法(行为)的抽象, 与抽象类有所不同(虽然在 C++中都是通过虚基类实现的), 抽象类是类层次结构的抽象, 反映了类之间的关系.

下面的代码主要来自 go语言学习指南的 7.6节, 接口是类型安全的鸭子类型.

Java 的接口(显式声明)

Java 的接口通过 interface 来声明, 通过 implements 实现接口. 接口本质上也是一个类, 在这个类中给出了需要实现的方法的签名.

但是 Java 的接口使用的是显式声明, 也就是说每次实现接口都要指定具体实现接口的类名. 来看代码

Learn_Java/Class_Test/Interface_test at main · zorchp/Learn_Java;

首先定义接口

java 复制代码
public interface Logic {
    String process(String data);
    public static void main(String[] args) {
    }
}

然后给出实现

java 复制代码
public class LogicImpl implements Logic {
    public String process(String data) {
        // Logic
        System.out.println(data);
        System.out.println("logic impl");
        return new String("nihao");
    }
}

客户端调用

java 复制代码
public class Client {
    private final Logic logic;

    public Client(Logic logic) {
        this.logic = logic;
    }
    public void program() {
        String data = new String("data is here ");
        this.logic.process(data);
        System.out.println("program()");
    }
}

调用接口的实现

java 复制代码
public class Interface_1 {
    public static void main(String[] args) {
        Logic logic = new LogicImpl();
        Client c = new Client(logic);
        c.program();

        // equals to :
        //  Client d = new Client(new LogicImpl());
        //  d.program();
    }
}

golang 的接口(隐式接口)

使用隐式接口的话只需要实现, golang 中 实现接口的所有方法就隐式地实现了接口

go 复制代码
package main

import "fmt"

type LogicProvider struct{}

func (lp LogicProvider) Process(data string) string {
	fmt.Println(data)
	return ""
}

type Logic interface {
	Process(data string) string
}

type Client struct{ L Logic }

func (c Client) Program() {
	data := "hello"
	c.L.Process(data)
}

func main() {
	c := Client{
		L: LogicProvider{},
	}
	c.Program()
}
相关推荐
ZYJCSZKJ3 小时前
基于地理位置围栏的短视频POI团购系统:LBS空间索引与流量分发实践
java·服务器·数据库
mldong9 小时前
引擎从不发一条消息:jeeflow 的两类扩展点与消息模块的分工
java·架构
君顾19 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
南棱笑笑生10 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
zhanghe68710 小时前
es的密码带有特殊字符,导出
java
平头哥技术团队10 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
pnoker10 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
乌萨奇也要立志学C++10 小时前
【洛谷】kmp算法
开发语言·算法
my_realmy10 小时前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
传奇开心果编程10 小时前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust