隐式和显式接口的区别

隐式和显式接口的区别


(隐式的实现不再探讨,只剖析显式的接口实现。)

定义的接口如下:两个接口的方法名及参数都相同

interface ICustomA
{
    Int32 CompareTo(string obj);
}
interface ICustomB
{
    Int32 CompareTo(string obj);
} 

类的实现方式如下:一个默认的(类本身的方法),两个显式实现的。

public class Number : ICustomA, ICustomB
{
    // 默认方法
    public int CompareTo(string obj)
    {
        return 0;
    }

    // 显式实现ICustomA
    int ICustomA.CompareTo(string obj)
    {
        return 0;
    }

    // 显式实现ICustomB
    int ICustomB.CompareTo(string obj)
    {
        return 0;
    }
}

三个方法,对应方式的调用方式如下:

    static void Main(string[] args)
    {
        Number p = new Number();
        p.CompareTo("默认");

        ICustomA pA = p as ICustomA;
        pA.CompareTo("显A");

        ICustomB pB = p as ICustomB;
        pA.CompareTo("显B");
    }

CLR读书笔记(2016/6/26 21:26:18)

<think>我们之前已经讨论过实现实现区别,但用户再次询问核心区别,说明可能需要更精炼的总结。 核心区别在于:实现需要程序员主动声明类型与接口的关系(通过特定代码模),而实现只需方法匹配,无需声明。 注意:Go语言本身是实现接口实现是开发者通过代码模(如var _ Interface = (*Type)(nil))来强制检查。 因此,核心区别可归纳为:声明方、验证时机、耦合度、可读性、维护性等。 但用户要求核心区别,所以需要高度概括。</think>### 实现 vs 实现的核心区别(Go接口) 在 Go 语言中,接口实现的根本差异体现在**声明方****验证机制**上: | 维度 | 实现 | 实现 | |--------------|-----------------------------------|-----------------------------------| | **声明要求** | 需主动声明类型-接口关系(代码级) | 无需任何声明 | | **验证方** | 编译时通过绑定语句立即验证 | 编译时自动检查方法签名 | | **错误反馈** | 在类型定义处报错(快速定位) | 在使用处报错(延迟发现) | | **代码示例** | `var _ Writer = (*File)(nil)` | 直接赋值:`var w Writer = File{}` | | **设计哲学** | 主动契约设计 | 被动鸭子类型 | | **核心本质** | 开发者添加的**验证约束** | 语言内置的**类型系统特性** | #### 关键区别图解 ```mermaid graph TD A[定义接口] --> B[实现] A --> C[实现] B --> D[主动声明:var _ Interface = Type] B --> E[编译时立即验证] C --> F[仅需方法匹配] C --> G[使用时自动转换] ``` ### 核心区别详解 1. **声明与发现的本质差异** - :开发者**主动宣告** "我的类型实现了此接口" - :编译器**被动发现** "这个类型的方法集匹配接口" 2. **错误处理对比** ```go // 实现:修改接口后立即报错 type Storage interface { Save() } type Disk struct{} var _ Storage = (*Disk)(nil) // 编译报错:Disk缺少Save方法 // 实现:错误延迟到使用点 func Store(s Storage) {...} Store(Disk{}) // 调用时才报错 ``` 3. **工程化影响** - 优势: - 接口变更时快速定位所有实现 - 清晰文档化类型职责 - 避免意外实现(如实现敏感接口) - 优势: - 更简洁的代码 - 灵活适配第三方类型 - 减少样板代码 > **Go语言设计者Rob Pike的观点**: > *"实现是Go的根基,它使接口实现解耦。验证是优秀的工程实践,但不是语言特性——它只是把编译器的类型检查提前了。"*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值