博文

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

摘要:      大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料.
一、抽象类:
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

二、接口:
接口是引用类型的,类似于类,和抽象类的相似之处有三点:
1、不能实例化;
2、包含未实现的方法声明;
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员); 另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。


三、抽象类和接口的区别:
1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中.
2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
3.一个类一次可以实现若干个接口,但是只能扩展一个父类
4.接口可以用于支持回调,而继承并不具备这个特点.
5.抽象类不能被密封。
6.抽象类实现的......

阅读全文(2350) | 评论: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关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该......

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

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

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

阅读全文(2148) | 评论: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()
......

阅读全文(2120) | 评论: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 元素......

阅读全文(3486) | 评论: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. ......

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

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

摘要:public interface IEnumerable
{
    IEnumerator GetEnumerator();
}
 
public interface IEnumerator......

阅读全文(1772) | 评论: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。 ......

阅读全文(3728) | 评论: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 Met......

阅读全文(1572) | 评论: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;
&......

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