设计模式之C#实现(一)--AbstractFactory之二(转)
public class ProductA2 : IAbstractProductA{ public ProductA2(){} public string ShowSelf(){ return this.ToString(); } public string ShowOther(IAbstractProductB b){ return b.ToString(); } } public interface IAbstractProductB{ string ShowSelf(); string ShowOther(IAbstractProductA a); } public class ProductB1 : IAbstractProductB{ public string ShowSelf(){ return this.ToString(); } public string ShowOther(IAbstractProductA a){
设计模式之C#实现(一)--AbstractFactory之一(转)
Abstract Factory 读书笔记 意图: 为创建相关的或者相互依赖的对象配置一个借口而不指定他们具体的类。 别名: Kit 理解: 抽象工厂是一种创建型的模式,它为我们创建对象提供了有效地方法,我们不用直接new对象而是可以为创建对象配置一个接口,该接口定义了如何创建对象的方法。我们还知道抽象工厂创建的对象是一个系列的或者是一族的。该模式的最大特点就是将它的具体创建的任务交给了他的子类也就是具体的类,因此我们将创建对象的时间延迟到了它的子类。我们知道,在设计模式(GOF)的书里说了设计模式是为有一定
C#锐利体验之第五讲 构造器与析构器(转)
构造器 构造器负责类中成员变量(域)的初始化。C#的类有两种构造器:实例构造器和静态构造器。实例构造器负责初始化类中的实例变量,它只有在用户用new关键字为对象分配内存时才被调用。而且作为引用类型的类,其实例化后的对象必然是分配在托管堆(Managed Heap)上。这里的托管的意思是指该内存受.NET的CLR运行时管理。和C++不同的是,C#中的对象不可以分配在栈中,用户只声明对象是不会产生构造器调用的。 实例构造器分为缺省构造器和非缺省构造器。缺省构造器是在一个类没有声明任何构造器的情况下,编译器强制为该类添加的一个无参数
C#锐利体验之第四讲 类与对象(转)
组件编程不是对传统面向对象的抛弃,相反组件编程正是面向对象编程的深化和发展。类作为面向对象的灵魂在C#语言里有着相当广泛深入的应用,很多非常“Sharp”的组件特性甚至都是直接由类包装而成。对类的深度掌握自然是我们“Sharp XP”重要的一环。 类 C#的类是一种对包括数据成员,函数成员和嵌套类型进行封装的数据结构。其中数据成员可以是常量,域。函数成员可以是方法,属性,索引器,事件,操作符,实例构建器,静态构建器,析构器。我们将在“第五讲 构造器与析构器”和“第六讲 域 方法 属性与索引器”对这些成员及其特性作详细的
C#锐利体验之第三讲 Microsoft.NET平台基础构造(转)
抛开Microsoft.NET平台去谈C#是没有意义的,C#之“Sharp”也正在其后端强大的平台。仅仅拘泥于语法层面是体验不了C#的锐利之处的,C#程序很多诡秘之处必须依靠Microsoft.NET平台才能深度的掌握和运用。简单的讲,Microsoft.NET平台是一个建立在开放互联网络协议和标准之上,采用新的工具和服务来满足人们的计算和通信需求的革命性的新型XML Web智能计算服务平台。它允许应用程序在因特网上方便快捷地互相通信,而不必关心使用何种操作系统和编程语言。 从技术层面具体来说,Microsoft.NET平台主要包括两个内核,即通用语言运行时(Common
基于C#的接口基础教程之十一(转)
第七节、覆盖虚接口 有时候我们需要表达一种抽象的东西,它是一些东西的概括,但我们又不能真正的看到它成为一个实体在我们眼前出现,为此面向对象的编程语言便有了抽象类的概念。C#作为一个面向对象的语言,必然也会引入抽象类这一概念。接口和抽象类使您可以创建组件交互的定义。通过接口,可以指定组件必须实现的方法,但不实际指定如何实现方法。抽象类使您可以创建行为的定义,同时提供用于继承类的一些公共实现。对于在组件中实现多态行为,接口和抽象类都是很有用的工具。 一个抽象类必须为类的基本类列表中列出的接口的所
基于C#的接口基础教程之九(转)
C#中不仅支持.Net 平台,而且支持COM平台。为了支持 COM和.Net,C# 包含一种称为属性的独特语言特性。一个属性实际上就是一个 C# 类,它通过修饰源代码来提供元信息。属性使 C# 能够支持特定的技术,如 COM 和 .Net,而不会干扰语言规范本身。C# 提供将COM接口转换为 C#接口的属性类。另一些属性类将 COM类转换为C# 类。执行这些转换不需要任何 IDL 或类工厂。 现在部署的任何COM 组件都可以在接口转换中使用。通常情况下,所需的调整是完全自动进行的。 特别是,可以使用运行时可调用包装 (RCW) 从 .NET 框架访问 COM 组件。此
基于C#的接口基础教程之十(转)
创建 COM 对象 COM coclass 在 C# 中表示为具有无参数构造函数的类。使用 new 运算符创建该类的实例等效于在 C# 中调用 CoCreateInstance。使用以上定义的类,就可以很容易地实例化此类: class MainClass { public static void Main() { FilgraphManager filg = new FilgraphManager(); } } 声明 COM 接口 COM 接口在 C# 中表示为具有 ComImport 和 Guid 属性的接口。它不能在其基接口列表中包含任何接口,而且必须按照方法在 COM 接口中出现的顺序声明接口成员函数。 在 C# 中声明的 COM 接口必须包含其基接口的所有成员
基于C#的接口基础教程之八(转)
第六节、接口转换 C#中不仅支持.Net 平台,而且支持COM平台。为了支持 COM和.Net,C# 包含一种称为属性的独特语言特性。一个属性实际上就是一个 C# 类,它通过修饰源代码来提供元信息。属性使 C# 能够支持特定的技术,如 COM 和 .Net,而不会干扰语言规范本身。C# 提供将COM接口转换为 C#接口的属性类。另一些属性类将 COM类转换为C# 类。执行这些转换不需要任何 IDL 或类工厂。 现在部署的任何COM 组件都可以在接口转换中使用。通常情况下,所需的调整是完全自动进行的。 特别是,可以使用运行时可调用包装 (RCW) 从 .NET
基于C#的接口基础教程之七(转)
第六节、接口转换 C#中不仅支持.Net 平台,而且支持COM平台。为了支持 COM和.Net,C# 包含一种称为属性的独特语言特性。一个属性实际上就是一个 C# 类,它通过修饰源代码来提供元信息。属性使 C# 能够支持特定的技术,如 COM 和 .Net,而不会干扰语言规范本身。C# 提供将COM接口转换为 C#接口的属性类。另一些属性类将 COM类转换为C# 类。执行这些转换不需要任何 IDL 或类工厂。 现在部署的任何COM 组件都可以在接口转换中使用。通常情况下,所需的调整是完全自动进行的。 特别是,可以使用运行时可调用包装 (RCW) 从 .NET
基于C#的接口基础教程之六(转)
对一个接口的继承也就继承了接口的所有成员,上面的例子中接口ITextBox和IListBox都从接口IControl中继承,也就继承了接口IControl的Paint方法。接口IComboBox从接口ITextBox和IListBox中继承,因此它应该继承了接口ITextBox的SetText方法和IListBox的SetItems方法,还有IControl的Paint方法。 一个类继承了所有被它的基本类提供的接口实现程序。 不通过显式的实现一个接口,一个派生类不能用任何方法改变它从它的基本类继承的接口映射。例如,在声明中 interface IControl { void Paint( ); } class Control: IControl { public voi
基于C#的接口基础教程之五(转)
第五节、实现接口 1、显式实现接口成员 为了实现接口,类可以定义显式接口成员执行体(Explicit interface member implementations)。显式接口成员执行体可以是一个方法、一个属性、一个事件或者是一个索引指示器的定义,定义与该成员对应的全权名应保持一致。 using System ; interface ICloneable { object Clone( ) ; } interface IComparable { int CompareTo(object other) ; } class ListEntry: ICloneable, IComparable { object ICloneable.Clone( ) {…} int IComparable.CompareTo(object other) {…} }
基于C#的接口基础教程之三(转)
基接口 一个接口可以从零或多个接口继承,那些被称为这个接口的显式基接口。当一个接口有比零多的显式基接口时,那么在接口的定义中的形式为,接口标识符后面跟着由一个冒号":"和一个用逗号","分开的基接口标识符列表。 接口基: :接口类型列表说明: 1、一个接口的显式基接口必须至少同接口本身一样可访问。例如,在一个公共接口的基接口中指定一个私有或内部的接口是错误的。 2、一个接口直接或间接地从它自己继承是错误的。 3、接口的基接口都是显式
基于C#的接口基础教程之二(转)
第二节 定义接口 从技术上讲,接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。 定义接口的一般形式为: [attributes] [modifiers] interface identifier [:base-list] {interface-body}[;] 说明: 1、attributes(可选):附加的定义性信息。 2、modifiers(可选): 允许使用的修饰符有 new 和四个访问修饰符。分别是:new、public、protected、internal、 private。在一个接口定义中同一修饰符不允许出现多次,new 修饰符只能出
基于C#的接口基础教程之一(转)
第一节 接口慨述 接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语言的限制(理论上)。接口可以从多个基接口继承,而类或结构可以实现多个接口。接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员。 接口好比一种模版,这种模版定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。类可以实现多个接口并且通过这些实现的接口被索引
C# 程序员参考--库教程(转)
本教程展示如何在 C# 中创建和使用库。教程本教程演示如何使用必要的编译器选项创建托管 DLL 文件,以及如何通过客户程序使用该库。示例本示例使用下列模块: DLL 库 (Functions.dll),从以下源文件生成: Factorial.cs:计算并返回某数的阶乘。 DigitCounter.cs:计算所传递的字符串中的数字位数。使用该 DLL 的客户程序 (FunctionTest.exe),从源文件 FunctionClient.cs 进行编译。本程序显示输入参数的阶乘。生成库若要生成该库,请将 Functions 作为当前目录,并在命令提示处键入下列内容:csc /target:library /out:Functions.dll Fa
C# 程序员参考--事件教程(转)
本教程展示如何在 C# 中声明事件、调用事件和挂接到事件。教程C# 中的“事件”是当对象发生某些有趣的事情时,类向该类的客户提供通知的一种方法。事件最常见的用途是用于图形用户界面;通常,表示界面中的控件的类具有一些事件,当用户对控件进行某些操作(如单击某个按钮)时,将通知这些事件。但是事件未必只用于图形界面。事件为对象提供一种通常很有用的方法来发出信号表示状态更改,这些状态更改可能对该对象的客户很有用。事件是创建类的重要构造块,这些类可在大量的不同程序中重复使用。使用委托来声明事件。如果您尚未学习“委托
C# 程序员参考--不安全代码教程(转)
该教程说明如何在 C# 中使用不安全代码(使用指针的代码)。教程在 C# 中很少需要使用指针,但仍有一些需要使用的情况。例如,在下列情况中使用允许采用指针的不安全上下文是正确的: 处理磁盘上的现有结构 涉及内部包含指针的结构的高级 COM 或平台调用方案 性能关键代码不鼓励在其他情况下使用不安全上下文。具体地说,不应该使用不安全上下文尝试在 C# 中编写 C 代码。警告 使用不安全上下文编写的代码无法被验证为安全的,因此只有在代码完全受信任时才会执行该代码。换句话说,不可以在不受信任的环境中执行不安全代码。例如,不能
C# 程序员参考--属性教程(转)
本教程展示如何创建自定义属性类,如何在代码中使用它们,以及如何通过反射查询它们。教程属性提供功能强大的方法以将声明信息与 C# 代码(类型、方法、属性等)相关联。与程序实体关联后,属性可在运行时查询,并可以以任意多种方式使用。属性的用法示例包括: 将帮助文档与程序实体关联(通过 Help 属性)。 将值编辑器关联到 GUI 框架中的特定类型(通过 ValueEditor 属性)。除一个完整的示例外,本教程还包括以下主题: 声明属性类 第一件需要做的事情是声明属性。使用属性类 创建属性后,随即将属性与特定的程序元素关联。通过反射访
C# 程序员参考--条件方法教程(转)
本教程演示条件方法,它们提供一种功能强大的机制,通过它可以根据是否定义了预处理器符号来包括或省略方法调用。示例文件请参见“条件方法”示例以下载和生成本教程中讨论的示例文件。教程条件方法使开发人员能够创建这样的方法,可将对这些方法的调用放在代码中,然后编译期间根据预处理符号包括或省略这些调用。假定您想在调试版本中启用某些断言代码,而在发布版本中禁用它们。在 C++ 中,有不止一种方法可以将此功能包含到您的代码中,例如: 使用 #ifdef 同时定义宏的调试版本和发布版本。调试版本调用跟踪代码,而发布版本不执行任