C#动静结合编程之一: 接口和委托的约束强度

程序世界有两种神秘的元素,它们无处不在,却常常未被察觉。它们一动一静,却又和谐相处。我给 这对兄弟取上不太恰当的名字,一个叫“协议”,一个叫“约束”。我们常常看到的动态语言、静态语言 背后,本质上就是“协议”与“约束”两种元素的作用。静态语言和动态语言本身没有一个明确的界限, 它们各有优势,又各有不足。

C#是一门优美的语言,它融合了静态和动态的优势,如果运用得当,必能动静结合,呈现出一种和谐 之美。特别是.NET平台和语言的快速发展,更展现了动静结合编程的活力。本篇是.NET动静结合编程的第 一篇,希望这个系列能和大家一起探讨如何在.NET平台上最大限度的发挥动静结合的潜能。本人还只 是.NET的初学者,对计算机理论的理解还很肤浅,文中错误欢迎批评指正,不足之处欢迎补充,谢谢!

被忽略的协议

谈到“协议”,最先浮现在我们脑海中的可能是TCP/IP协议栈,但其实我们随处都在和协议打交道。 下面的例子,你看出协议来了吗?

B(){
    ArrayList lst = A();
    foreach (string item in lst){
        Console.WriteLine(item.Length);
    }
}

方法B假定方法A遵守:返回的ArrayList内部都是string类型的元素。这就是它们之间的协议,这个协 议不受编译器静态检查的约束。所以,协议意味着运行时的不确定性,方法A完全可能在返回结果中装入 非string类型的元素,而这将导致B在运行时产生异常。

.NET2.0通过泛型集合增加了静态类型约束:

B(){
    List<string> lst = A();
    foreach (string item in lst){
        Console.WriteLine(item);
    }
}

这样,B再也不用担心lst内部存在非string类型的元素了,一切得益于泛型为A加上的静态类型约束。

约束有强弱

约束有强弱之分。越强的约束越安全,静态性越强,受编译器的支持越大;反之,越弱的约束,动态 性越强,运行时灵活性越大。

常常看到关于单方法接口和委托异同的讨论,不少朋友认为它们完全等价。其实,它们有明显不同的 约束强度。接口是静态类型约束,而委托只是静态签名约束,二者的强度完全不同。换句话说,委托具有 更多的协议性,只要符合签名,都可以被委托调用,而能被接口调用的对象必须实现该接口。

时间: 2024-08-18 07:37:29

C#动静结合编程之一: 接口和委托的约束强度的相关文章

C#动静结合编程之四:泛型委托

多态 多态是什么?一句话:接口和实现的1:n映射.多态让程序能通过统一的接口(广义的接口,意指规范 )调用不同的实现,从而增强程序的表达能力和灵活性.我们最为熟悉的多态形式是包括接口继承在内的 类型多态: var animals = new List<IAnimal>() { new Cat("Missy"), new Cat("Mr. Bojangles"), new Dog("Lassie") }; foreach (var an

C#动静结合编程之三:Duck Typing

中庸 C#是静态类型语言,要使用类型必须引用该类型的定义.因此,从软件组织角度会发生组件间的引用依赖关系.常见的引用依赖关系有两种模式: a. 正向依赖:组件A用到了组件B中定义的类T,组件A直接引用组件B,依赖关系是"组件A -> 组件B". b. 反向依赖:组件A通过接口I定义功能规范,针对抽象编程:组件B反过来引用组件A,并定义类T实现接口I:由另一组件C将I与T粘合起来,依赖关系是"组件A <- 组件B".这就是著名的IoC方式. 简单说来,Io

ASP.NET入门随想之多态、接口与委托

asp.net     曾几何时,我们居住的陆地沉睡在海底,大陆也紧密的联系在一起,千百年过去了七大洲的地壳板块在缓缓移动,喜马拉雅山在慢慢增高,世界在变,唯一不变的是变化. ■ 软件开发的悖论 - 把变化变成计划 在软件开发活动的过程中,常被一个悖论所缠绕:不写码就搞不清该做什么:搞不清做什么又不知道该如何写码. 人的思维是很随意的东西,不同的人,或同一个人的不同阶段,对同一件事情的看法都会有差异,可谓是远看成岭侧成峰,远近高低各不同.随意再加上变化,常常引起项目流产或工期大大拖延. 之所以会

c# 委托 接口-c#委托和接口的组合问题

问题描述 c#委托和接口的组合问题 现在有个接口interface a {void hi();} 有个代理 delegate SomeDelegate(); 如何限制这个代理所需要的方法 是实现了接口a的类的hi()方法?

深入解析Java编程中接口的运用_java

接口的本质--接口是一种特殊的抽象类,这种抽象类里面只包含常量和方法的定义,而没有变量和方法的实现. 抽象类所具有的一些东西接口可以具有,假如一个抽象类里面所有的方法全都是抽象的,没有任何一个方法需要这个抽象类去实现,并且这个抽象类里面所有的变量都是静态(static)变量,都是不能改变(final)的变量,这时可以把这样的抽象类定义为一个接口(interface).把一个类定义成一个接口的格式是把声明类的关键字class用声明接口的关键字interface替换掉即可. 接口(interface

对抽象编程:接口和抽象类

1. 引言 在我之前的一篇post <抽象类和接口的谁是谁非 >中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉.同时,我将把上贴中的问题顺便也在此做以交代. 2. 概念引入       什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称.参数和返回值.接口方法不能包含任何实现,clr 允许接口可以包含事件.属性.索引器.静态方法.静态字段.静态构造函数以及

一起谈.NET技术,对抽象编程:接口和抽象类

1. 引言 在我之前的一篇post <抽象类和接口的谁是谁非 >中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉.同时,我将把上贴中的问题顺便也在此做以交代. 2. 概念引入       什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称.参数和返回值.接口方法不能包含任何实现,CLR 允许接口可以包含事件.属性.索引器.静态方法.静态字段.静态构造函数以及

对抽“.NET研究”象编程:接口和抽象类

1. 引言 在我之前的一篇post <抽象类和接口的谁是谁非 >中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉.同时,我将把上贴中的问题顺便也在此做以交代. 2. 概念引入       什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称.参数和返回值.接口方法不能包含任何实现,CLR 允许接口可以包含事件.属性.索引器.静态方法.静态字段.静态构造函数以及

[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

相关文章: [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.NET] 第四回:后来居上:class和struct 1. 引言 在我之前的一篇post<抽象类和接口的谁是谁非>中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉.同时,我将把上贴中的问题顺便也在此做以交代. 2. 概念引入 什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称