博文

C#中抽象类和接口的区别(2011-06-03 15:07:00)

摘要:      大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料. 一、抽象类: 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。 二、接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1、不能实例化; 2、包含未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员); 另外,接口有如下特性: 接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。 三、抽象类和接口的区别: 1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中. 2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法; 3.一个类一次可以实现若干个接口,但是只能扩展一个父类 4.接口可以用于支持回调,而继承并不具备这个特点. 5.抽象类不能被密封。 6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的. 7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许......

阅读全文(2530) | 评论:0

在C++、Java等众多OOP语言里都可以看到virtual的身影,而C#作为一(2011-06-03 14:46:00)

摘要:在C++、Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外。 虚拟函数从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类。 那么飞禽就是申明类,麻雀是实例类。 用基类指针指向派生类对象时,实现多态性的需要 虚函数和一般函数在重载上有何区别呢? 虚函数主要是多态中使用,在设计模式时,虚函数的作用是显而易见的 虚函数的作用是为了让程序在运行时确定所要调用的函数,它在基类中定义,而在派生类中给出实现 虚函数就是实现一般性功能的一种函数,在基类中定义并且实现,如果在派生类中重载这个函数,那么调用此函数时就会调用派生类中的函数,反之调用基类中默认的虚函数 A a= new A() A b =new B() A c= new C() A d= new D() A e= new E() 类B 继承 类A 类C 继承 类B 类D 继承 类C 类E 继承 类D 当调用对象的方法时 1.先检查该对象申明的类,是否有该函数,以及该函数的否是virturl 或者override,或者new关键字 2.在检查实例化的类,如果实例化类与申明类相同,就调用该函数,如果不是同一类,那么就检查实例的类是否有实现该函数 如果有重新实现申明类中的方法,那么就调用实例类中的方法,如果没有重新实现申明类的方法,就再继续查找实例类的父类 是否有这个方法,如果有,是否重新实现,如果重新实现,就调用该父类的方法 具体的检查的流程如下 1、当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数; 2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。 3、在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果是有,那么OK,它就不会再......

阅读全文(2431) | 评论:0

关于接口的作用的个人小结(更新当中)(2011-06-01 13:52:00)

摘要:接口作用: 1 程序员间写程序的约定 2 减少调用对象时候生成的实例 3 方便程序修改和维护......

阅读全文(2334) | 评论:0

深入浅出分析C#接口的作用(2011-06-01 10:50:00)

摘要:1、C#接口的作用 : C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正认识到接口的作用的时候就觉得用接口是多此一举,当然你这样想那是绝对绝对错误的,比尔盖茨的微软请的员工都是比盖茨还聪明的人,他们的C#能添这样的多足吗?!关于接口的作用,网上有一位就真的深入浅出给我们做了很好理解的分析。 我们定义一个接口 public interface IBark { void Bark(); } 再定义一个类,继承于IBark,并且必需实现其中的Bark()方法 public class Dog:IBark { public Dog() {} public void Bark() { Consol.write("汪汪"); } } 然后,声明Dog的一个实例,并调用Bark()方法 Dog 旺财=new Dog(); 旺财.Bark(); 试想一样,若是想调用Bark()方法,只需要在Dog()中声明这样的一个方法不就行了吗,干什么还要用接口呢.因为接口中并没有Bark()具体实现.真的实现还是要在Dog()中.那么使用接口不是多此一举吗? 还有人是这样说的:从接口的定义方面来说,接口其实就是类和类之间的一种协定,一种约束.还拿上面的例子来说.所有继承了IBark接口的类中必需实现Bark()方法.那么从用户(使用类的用户)的角度来说,如果他知道了某个类是继承于IBark接口,那么他就可以放心大胆的调用Bark()方法,而不用管Bark()方法具体是如何实现的.比如,我们另外写了一个类. public class Cat:IBark { public Cat() {} public void Bark() { Consol.write("喵喵"); } } 当用户用到Cat类或是Dog类的时候,知道他们继承于IBark,那么不用管类......

阅读全文(2297) | 评论:0

HtmlHelper解析 (二)(2011-05-05 13:59:00)

摘要:1.表单   使用HtmlHelper的扩展类FormExtensions来生成Form,这里重点介绍BeginForm方法,它有13个重载方法,通过重载方法为表单添加属性,像action,method,id,enctype等属性。下面我们用其中一个方法来生成表单:   view plaincopy to clipboardprint?00.<%using(Html.BeginForm("action","controllName", FormMethod.Post)){ %>  00.        <%} %>     生成结果     view plaincopy to clipboardprint? 00.<form action="/controllName/action" method="post"></form>       2.表单元素   a.来看一下InputExtensions类中的一些生成元素的常方法,其中每个方法都有重载方法:  • CheckBox方法: 返回复选框 input 元素  •        Hidden方法:返回隐藏的 input 元素  •        Password方法:返回密码 input 元素  •  RadioButton方法:返回用于呈现互斥选项的单选按钮 input 元素  •  TextBox方法:返回文本 input 元素        直接上例子:     view plaincopy to clipboardprint? 00.<%using (Htm......

阅读全文(3720) | 评论:0

HtmlHelper解析与View (一)(2011-05-05 13:56:00)

摘要:一、   HtmlHelper类位于System.Web.Mvc.Html下,主要由以下扩展类组成:   关于扩展方法的学习:http://msdn.microsoft.com/zh-cn/library/bb383977.aspx 二、mvc页面继承自:System.Web.Mvc.ViewPage<T>     view plaincopy to clipboardprint? 01.<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>      由于mvc页面默认继承自System.Web.Mvc.ViewPage<T>,所以我们需要了解一下这个类 看下所在位置:   这个类中的属性比较多,会包括一些由下面(controller)传上来的数据,一些缓存值了等等,关于这个类的详细信息可以查看:http://msdn.microsoft.com/zh-cn/library/system.web.mvc.viewpage.aspx 在这个类中介绍两个属性:ViewData,Html 1.ViewData 是一个ViewDataDictionary类型的属性,是由键,值对组成的,其作用就是传递数据,来个例子:   曾经在HomeController中写过的index方法,把一个符串放入ViewData中,然后在view/home/index.aspx中显示出来       view plaincopy to clipboardprint? 01.//HomeController中的index方法  02.public ActionResult Index()  03.{  04.     //给view赋值  05.     ViewData["data"] = "Hello MVC";  06......

阅读全文(3316) | 评论:0

IEnumerable与IEnumerator区别(2011-04-29 22:30:00)

摘要:public interface IEnumerable {     IEnumerator GetEnumerator(); }   public interface IEnumerator {     bool MoveNext();     void Reset();       Object Current { get; } }   IEnumerable和IEnumerator有什么区别?这是一个很让人困惑的问题(在很多forum里都看到有人在问这个问题)。研究了半天,得到以下几点认识:   1、一个Collection要支持foreach方式的遍历,必须实现IEnumerable接口(亦即,必须以某种方式返回IEnumerator object)。   2、IEnumerator object具体实现了iterator(通过MoveNext(),Reset(),Current)。   3、从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator object就是一个iterator。   4、IEnumerable和IEnumerator通过IEnumerable的GetEnumerator()方法建立了连接,client可以通过IEnumerable的GetEnumerator()得到IEnumerator object,在这个意义上,将GetEnumerator()看作IEnumerator object的factory method也未尝不可。 IEnumerator   是所有枚举数的基接口。           枚举数只允许读取集合中的数据。枚举数无法用于修改基础集合。   ......

阅读全文(2152) | 评论:0

.Net IList、ICollection、IEnumerable辨析(2011-04-29 22:29:00)

摘要:祖宗:IEnumerable 此接口只有一个方法 GetEnumerator(); 是FrameWork为了实现迭代器模式设计的接口。所有继承了IEnumerable的类,要使用foreach迭代器时,就需要使用该方法。因此也只有实现了该接口的类才可以使用foreach。 ICollection继承自IEnumerable,IList继承自ICollection 这两个接口都是为了给集合提供一些公用的方法。只是分了两个层次,IList比ICollection多几个方法,增加,移除成员。可以简单理解为:ICollection主要针对静态集合;IList主要针对动态集合。 IList,ICollection,IEnumerable 在命名空间System.Collections中。 IList<T>,ICollection<T>,IEnumerable<T> 在System.Collections.Generic 命名空间中。 IList<T>,ICollection<T>,IEnumerable<T> 是2.0引入泛型以后新增的。主要是提高重用性与类型安全。 IEnumerable<T>继承自IEnumerable ICollection<T>继承自IEnumerable<T> IList<T>继承自ICollection<T> 因此可以完全使用泛型接口,而放弃使用ICollection和IList。泛型接口提供了更好的类型安全和编译时的检验。 补充:IEnumerable<T>和IEnumerable都只有一个方法。ICollection<T>和ICollection的结构是不一样的。ICollection<T>比ICollection多几个方法。它包含了几个IList中的几个方法。也许是对以前的改进。IListSource 接口通过实现 GetList 方法来公开用于数据绑定的 IList。 ......

阅读全文(3965) | 评论:0

C#来创建和读取XML文档(2011-04-29 09:55:00)

摘要:扩展标记语言XML(eXtensible Markup Language),是由W3C组织制定的。做为用于替代HTML语言的一种新型的标记语言,XML内部有着很多基本标准,XML就是通过与这些相关标准地结合,应用于科学计算、电子出版、多媒体制作和电子商务的。C#作为一种新型的程序语言,是.Net框架的一个重要组成部分,他和XML的关系颇深。本文就从一个方面来探讨一下这二者的关系。即:看用C#如何来创建和读取XML文档。 一. 本文程序设计和运行的软件环境: (一).微软公司视窗2000服务器版 (二)..Net FrameWork SDK Beta 2 二. C#创建XML文档: 在本文中我们来介绍一下用C#创建XML文档的二种方法,这二种方法各有千秋,第一种创建起来更灵活,第二种创建起来更方便。 (一).C#创建XML文档的第一种方法: 这一种方法是按照按照XML的结构一步一步的构建XML文档。C#构建XML文档通过.Net FrameWork SDK中的命名空间"System.Xml"中封装的各种类来实现的。下面就按照一个XML典型文档结构来介绍一下。 (1).首先要创建一个空的XML文档: 在命名空间"System.Xml"中有一个类"XmlDocument",C#通过这个类来描述XML文档。下面是用C#创建一个XML文档。 xmldoc = new System.Xml.XmlDocument ( ) ; (2).在XML的文档的最头部加入XML的声明段落: 利用"XmlDocument"类中的 "CreateNode" 方法可以创建一个指定类型的XML节点,"CreateNode" 方法的调用方法总共有三种,在本文中使用的其一般的方法,具体语法如下: XmlDocument.CreateNode Method ( XmlNodeType , String , String ) 然后在利用"XmlDocument"类中的"AppendChild"方法在XML文档中加入此节点,用C#在XML文档中加入声明段落实现的语句如下: xmlnode = xmldoc.CreateNode......

阅读全文(1788) | 评论:0

Attribute在.NET编程中的应用(三)(2011-04-27 12:07:00)

摘要:用于参数的Attribute 在编写多层应用程序的时候,你是否为每次要写大量类似的数据访问代码而感到枯燥无味?比如我们需要编写调用存储过程的代码,或者编写T_SQL代码,这些代码往往需要传递各种参数,有的参数个数比较多,一不小心还容易写错。有没有一种一劳永逸的方法?当然,你可以使用MS的Data Access Application Block,也可以使用自己编写的Block。这里向你提供一种另类方法,那就是使用Attribute。   下面的代码是一个调用AddCustomer存储过程的常规方法: public int AddCustomer(SqlConnection connection,   string customerName,   string country,   string province,   string city,   string address,   string telephone) {    SqlCommand command=new SqlCommand("AddCustomer", connection);    command.CommandType=CommandType.StoredProcedure;    command.Parameters.Add("@CustomerName",SqlDbType.NVarChar,50).Value=customerName;    command.Parameters.Add("@country",SqlDbType.NVarChar,20).Value=country;    command.Parameters.Add("@Province",SqlDbType.NVarChar,20).Value=province;    command.Parameters.Add("@City",SqlDbType.NVarChar,20).Value=city;   ......

阅读全文(1741) | 评论:0