在动态语言的世界里一直流传着一种叫做鸭子类型的风格,其来自谚语:“如果行鸭子一样走路,像鸭子一样呱呱叫,那它就是一只鸭子”。
从鸭子类型,我们可以联想到它的推导,并不在乎类型的真正实体,只要他的行为有鸭子的特性,那么我们就可以把它当做一只鸭子来看到。在动态语言设计中,可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型的实例,而不在于它是否显示的实现或者继承。
鸭子类型在动态语言中被广为奉行。某类接口需要一个log接口,换句话说这借口中需要调用传入对象的log,方法,在动态语言中无论你传入的是什么对象,只有具有log方法则就是合法的。而java,c#这类静态强类型语言(当前首先声明c#已经不是纯的静态强类型语言,它具有dynamic,表达式,当然这里所说的c#是去掉这类特性,或者说C#2.0吧)我们传入的对象是必须显示实现该接口的类实例,他们直接必须具有显示的继承链。
以上所说的是两类语言设计中的对抽象的制约的区别。
Javascript中鸭子型的实现:
function log(logger){ logger.log(“hello world”); } log({log:function(msg){ console.log(msg); }});
代码量很少,这里只是一种简单的约定,而不是强制,使得我们的自控感增强,所以我喜欢javascript这门语言给我的自由度。但是相对于java这类静态强类型语言而言是将语法的检查推向了运行时期,延迟了发现问题的时间,不助于我们的调试。在强类型系统的语言中由于具有完备的类型信息,我们可以提高良好的IDE于开发时限制,有助于我们的大规模开发。所以这里没有对错,只是看你的选择和喜爱。如果你是一个优秀的程序员,动态语言这种检查的推迟对你并无什么问题,因为你能够有条理次序的节奏型开发。
关于鸭子型风格这里还得必须提到go语言,也是go语言带来我对这种风格的思考。
我们还可以显示的定义在消费者方法中,形如
func SomeFunction(logger interface{Log(string)}){ logger.Log(“hello world, I am go lang”). }
实现提供者:
type S struct { } func (this *S)Log(msg string) { console.log(msg) }
在类型S就是一个实现了Logger的实例。
Go还有一种叫做空接口,能够容纳万物的东西;
func log(any interface{}) int { return any.(I).Get() }
Go语言不同于其他鸭子类型语言的是它实现了在编译时期检查,同时也不失这种自由度。
另外TypeScript想必你也知道 ,这与google的dart一样致力于将javascript带入大规模开发的语言,不同的是TypeScript是javascript的超集,并不是重造一门新语言。他为javascript引入的接口,类型,泛型等较完备的类型系统,是的能够有更好的IDE支持,从某种程度上来说,这是对鸭子类型或者javascript编译器的检查推迟的弥补。
相关推荐
首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。 以下是维基百科中对鸭子类型得论述: 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象...
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。 这个概念的名字来源于由James ...
- **接口**:Go语言的接口是鸭子类型的一种实现,通过接口可以实现多种设计模式,如依赖注入和适配器模式。 - **内存管理**:Go语言使用垃圾回收机制,自动管理内存,降低了程序员对内存泄漏的担忧。 - **并发...
鸭子类型是动态类型的编程语言中的一种概念,它不关心对象的类型本身,而是关注对象的方法和属性是否满足特定的需求,即“如果它走起路来像鸭子,叫起来也像鸭子,那它就是鸭子”。在JavaScript中,由于其动态和弱...
Go语言的接口实现是鸭子类型,即“如果它走起路来像鸭子,叫起来也像鸭子,那它就是鸭子”。 7. **并发编程**:Go语言通过goroutines(轻量级线程)和channels(通信通道)提供了高效的并发机制。goroutines可以...
2. 鸭子类型(Duck Typing):Ruby 中的鸭子类型强调“如果它走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子”。这意味着对象的使用取决于它是否响应特定的方法,而不是它的具体类。这种方法使得代码更具适应性和...
8. **接口与鸭子类型**:Go的接口是一种动态类型,通过接口可以实现多态。通过实现接口,不同的结构体可以共享相同的接口方法,实现解耦和灵活性。 9. **反射与类型断言**:反射允许程序在运行时检查和修改自身的...
因为很多人没有注意到这点,学完 Java 基础语言就直接去学 J2EE,有的甚至鸭子赶架,直接使用起 Weblogic 等具体 J2EE 软 件,一段时间下来,发现不过如此,挺简单好用,但是你真正理解 J2EE 了吗?你在具体案例中的...
在接口方面,Go语言采用了鸭子类型,即“如果它走起路来像鸭子,叫起来也像鸭子,那它就是鸭子”。理解接口的定义和使用,以及如何利用接口实现多态性,能提高代码的可扩展性和灵活性。 此外,Go的结构体和方法使...
这对于实现鸭子类型(Duck Typing)和依赖注入等设计模式特别有用。 4. `Callable`类型的增强:`types_mypy_extensions`提供了对`Callable`类型的更细粒度控制,如指定参数数量、类型以及返回值类型。 5. 其他扩展...
本书通过独特的Head First系列风格,采用大量的图表和幽默的语言来讲解抽象的设计模式概念,使得读者能够更加轻松地理解和掌握这些复杂的概念。 #### 二、主要内容概述 ##### 第1章:欢迎来到设计模式的世界 - **...
在编程领域,特别是Python语言中,"鸭子类型"(Duck Typing)和多态是两个关键概念,它们有助于实现灵活和可扩展的代码设计。这篇文章将详细讲解这两个概念及其在Python中的应用。 首先,多态(Polymorphism)是指...
6. **Go的结构与接口**:介绍接口的概念,以及如何使用接口实现面向对象编程,强调Go语言中的"鸭子类型"。 7. **并发编程**:这是Go语言的一大特色,会介绍goroutine(轻量级线程)的创建和使用,以及channel(通信...
这种“鸭子类型”的设计让Go语言具有了高度的灵活性。 四、标准库 Go语言的标准库覆盖了网络、文件系统、加密算法、JSON和XML解析、时间日期操作等多个方面,提供了丰富的功能。例如,net包提供了网络编程的支持,...
6. 接口和类型系统:Go语言的接口使用非常灵活,允许动态类型和鸭子类型。理解接口的工作方式,以及如何利用接口进行设计,是提升Go编程能力的关键。 7. 包管理与模块系统:随着Go 1.11引入了官方的模块系统,理解...
6. **接口**:Go语言的接口是一种强大的抽象机制,通过“鸭子类型”实现动态行为。接口的零值即可用,无需显式初始化,这为实现设计模式提供了便利。 7. **标准库**:Go语言的标准库非常丰富,涵盖了网络编程、文件...
鸭子类型是动态类型语言的一个重要概念,它以“如果它看起来像鸭子、游泳像鸭子、叫声像鸭子,那么它就是鸭子”这句话为名。在Python中,意味着你可以将对象传递给期望特定方法和属性的函数,而不是关心对象是否拥有...
7. **接口(Interface)**:Go语言的接口非常独特,它们是鸭子类型的实现,即“如果它走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子”。接口提供了一种方式来定义行为,而不是具体的实现,这使得代码更具扩展性和...
通过接口,可以实现鸭子类型,提供了一种松散耦合的实现多态的方式。 6. **内存管理与垃圾回收**:Go语言有内置的垃圾回收机制,开发者无需手动管理内存,但了解其工作原理有助于优化程序性能。 7. **错误处理**:...
接口通过鸭子类型实现多态,无需显式继承。 3. **垃圾回收**:Go语言有自己的内存管理机制,包括自动垃圾回收,开发者无需关心内存分配和释放的细节,降低了内存管理的复杂性。 4. **CSP并发模型**:Go语言的设计...