- 浏览: 2010636 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (1409)
- asp/asp.net学习 (241)
- oracle (10)
- delphi (295)
- java (27)
- pb (1)
- 每日点滴 (49)
- 学习方法 (40)
- 思想方面 (104)
- C语言 (5)
- C++ (1)
- 代码重构经验 (5)
- 软件工程 (3)
- 数据库 (99)
- 英语学习 (3)
- mysql (1)
- 该关注的网站或者网页 (42)
- 总结 (7)
- 要去做的事情 (33)
- 算法 (1)
- 网络方面 (29)
- 随感 (96)
- 操作系统 (36)
- UML (12)
- 常用工具的使用 (55)
- 脚本 (7)
- 汇编 (62)
- 数据结构 (2)
- 财务 (38)
- 语文作文 (16)
- 法律 (1)
- 股票 (88)
最新评论
-
devwang_com:
可以,学习了~~
列出文件夹下所有文件夹的树形结构--Dos命令 tree的使用 -
hvang1988:
不管用啊 frxrprt1.PreviewForm.Pare ...
fastReport预览时嵌入到别的窗体 -
00915132:
我也有这个疑问,非常 感 谢
left join加上where条件的困惑 --SQL优化 -
zhuyoulong:
学习了,高效读书
软件架构师要读的书 -
nTalgar:
非常感谢分享!
Application.ProcessMessages用法:
转自:http://www.soaspx.com/dotnet/csharp/csharp_20091030_1359.html
一、接口
接口是C#中很常见的工具,概念什么的就不说了,这里讲几个值得注意的小地方:
1、接口内部只能有函数、属性和事件的声明:
{
void Show();
string Type //--属性的声明
{
get; //-- get; 不能为get{};或是:get();
set;
}
event AddChildren Add;
}
在接口中声明的成员都不需要访问修饰符(public,private等),因为接口成员的权限默认都是public,另外值得注意的是接口中之所以能够声明事件是因为事件就是委托的特殊属性。
接口不能是静态的,接口成员也只能声明为实例成员不能声明为静态成员,如下声明就是错误的:
{
static void Show();
string Type
{
get;
set;
}
event AddChildren Add;
}
你会得到提示:
错误 1 修饰符“static”对该项无效 C:\Documents and Settings\HMD\桌面\CLR_Excise\CLR_Excise\Lib.cs 10 22 CLR_Excise
原因是如果接口是静态的就无法被继承,静态成员也无法被接口直接访问(因为接口中的成员都还没有实体只是声明)所以定义在接口中无意义。
2、接口支持部分声明:
上面的接口实际上可以在一个命名空间里声明为3部分:
{
void Show();
}
partial interface IParent
{
string Type
{
get;
set;
}
}
partial interface IParent
{
event AddChildren Add;
}
上面这种部分接口的声明方式和声明为一个接口的效果完全相同,若要了解部分关键字partial请查看:C#里partial关键字的作用(转摘)
3、接口的实现:
接口成员的实现方式分为两种:
<1>隐式实现:
{
#region IParent 成员
public void Show()
{
throw new NotImplementedException();
}
public string Type
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public event AddChildren Add;
#endregion
}
在类中隐式声明的接口成员都必须是public访问权限
(2)如果有一个类C实现了两个接口IA、IB且IA、IB都有同名函数void Display();那么可以在C中隐式实现Display,这样即实现了IA的Dislpay也实现了IB的Display
例如:
public interface IParent
{
void Show();
string Type
{
get;
set;
}
event AddChildren Add;
}
public interface IFather
{
void Show();
string Type
{
get;
set;
}
event AddChildren Add;
}
public class ChildrenA : IParent, IFather
{
#region IParent,IFather 成员
public void Show()
{
throw new NotImplementedException();
}
public string Type
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public event AddChildren Add;
#endregion
}
在上面类CA中将IParent和IFather的同名成员都用隐式实现接口成员的方式一次性实现了。
(3)隐式实现接口属性的时候可以扩充接口属性的访问器,例如:
{
string Type
{
get;
}
}
public class CParent : IParent
{
#region IParent 成员
public string Type
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
#endregion
}
本来接口属性Type只有get访问器,但是实现接口的类CParent扩充了接口属性Type即定义了get访问器也定义了set访问器,这在隐式实现接口属性的时候是允许的,但是在显式实现接口属性的时候必须严格按照接口定义的格式来!
<2>显式声明接口:
{
void IParent.Show()
{
throw new NotImplementedException();
}
string IParent.Type
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
event AddChildren IParent.Add
{
add { throw new NotImplementedException(); }
remove { throw new NotImplementedException(); }
}
}
显式实现接口不能设置实现成员的访问权限(因为显式声明成员的权限就是其对应接口成员的权限,当然就是public)
此外显式实现接口需要注意以下几点:
(1)显式实现接口,那么实现的接口成员只能由接口调用,因为显式实现的接口成员对于实现类来说是不可见的。
(2)显式实现接事件的时候要注意,只能显示实现事件的定义,例如显式实现IParent.Add事件的时候,用的显式实现事件:
event AddChildren IParent.Add
{
add { throw new NotImplementedException(); }
remove { throw new NotImplementedException(); }
}
如果用隐式实现事件就会报错:
event AddChildren IParent.Add
提示:错误 1 事件的显式接口实现必须使用事件访问器语法 C:\Documents and Settings\HMD\桌面\CLR_Excise\CLR_Excise\Lib.cs 45 38 CLR_Excise
(3)上面隐式实现接口(3)中的例子没有区分IParent、IFather同名成员的实现,而是在继承类CA中由隐式实现方式统一实现。下面举例说明如何将IParent、IFather的同名成员分别实现:
还是有一个类C实现了两个接口IA、IB且IA、IB都有同名函数void Display();,这次为了区分IA,IB同名成员Dispaly函数的实现,可以在CA中将一个接口的Display函数用显式方式实现,这说明在实现接口的时候可以将其中一个接口的同名成员用显式方式实现,以区分同名成员的实现
interface IParent
{
void Show();
string Type
{
get;
set;
}
event AddChildren Add;
}
interface IFather
{
void Show();
string Type
{
get;
set;
}
event AddChildren Add;
}
class ChildrenA : IParent, IFather
{
#region IParent 成员
public void Show()
{
throw new NotImplementedException();
}
public string Type
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public event AddChildren Add;
#endregion
#region IFather 成员
void IFather.Show()
{
throw new NotImplementedException();
}
string IFather.Type
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
event AddChildren IFather.Add
{
add { throw new NotImplementedException(); }
remove { throw new NotImplementedException(); }
}
#endregion
}
现在就将IParent和IFather接口的同名成员分开实现了,其中将IFather接口的同名成员用显式方式声明以区分IParent接口的实现。事实上可以将IParent和IFather的成员都以显式方式实现,不过这样实现类CA就不能访问到IParent和IFather的成员了,只有用IParent和IFather来访问它们各自的成员。
(4)如果实现类继承了具有同名成员的抽象类,那么加上override关键字后即实现了抽象类也实现了接口
interface IParent
{
void Show();
string Type
{
get;
set;
}
event AddChildren Add;
}
abstract class AParent
{
public abstract void Show();
public abstract string Type
{
get;
set;
}
public abstract event AddChildren Add;
}
class ChildrenA :AParent, IParent
{
#region AParent、IParent 成员
public override void Show()
{
throw new NotImplementedException();
}
public override string Type
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public override event AddChildren Add;
#endregion
}
二、抽象类
抽象类是C#里面用的相对较少的工具,不过在有些场合他比接口更有用,抽象类的作用与接口类似就是声明个框架,让继承类照着这个框架去实现,不过抽象类允许对已经确定的部分先进行实现,继承类要做的就是实现没有确定的成员(抽象成员)
abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。
在使用抽象类的时候需要注意:
(1)抽象类和接口一样是个框架,本身不能被实例化,只能通过继承类将其实例化。
(2)抽象类不能使用sealed和static关键字,因为使用sealed关键字表示类不能被继承,而静态类也不能被继承,抽象类不被继承是完全没有意义的。
(3)实现抽象类的类必须实现抽象类的所有抽象成员(标记了abstract的成员):
{
public abstract void Show();
public abstract string Type
{
get;
set;
}
public abstract event AddChildren Add;
public int tInt
{
get
{
return 1;
}
}
}
public class Parent : AParent
{
public override void Show()
{
throw new NotImplementedException();
}
public override string Type
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public override event AddChildren Add;
}
Parent类实现了AParent的所有抽象成员,但是并没有实现AParent的非抽象成员public int tInt
(4)抽象成员都是虚成员(virtual),这一点上面的代码中可以看到,实现抽象类的成员都使用了关键字override(实现抽象成员必须要用override)表示重写抽象类的抽象成员
(5)抽象成员不能标记为static(原因同接口)、virtual,且抽象成员不能是private的(原因就是private成员无法被继承)。
(6)抽象类的抽象成员可以重写(override)或隐藏(new)基类成员:
{
public abstract void Call();
}
abstract class ACB : ACA
{
public override abstract void Call();
}
如上所示ACB的抽象成员就重写了父类ACA的抽象成员
(7)抽象类也支持部分定义,例如可以将(3)中的AParent分成3部分定义,其效果和定义成一个相同:
{
public abstract void Show();
public int tInt
{
get
{
return 1;
}
}
}
public abstract partial class AParent
{
public abstract string Type
{
get;
set;
}
}
public abstract partial class AParent
{
public abstract event AddChildren Add;
}
发表评论
-
关于 字符串中的单引号, 在sql存储过程中的传输总结; 逗号分隔的多个变量提取方法.
2011-10-14 17:49 3357摘自:http://blog.csdn.net/nutia ... -
抓取网站内容 asp.net
2011-10-11 13:28 1007HttpWebRequest myReq ... -
两个DATASET合并成一个新的DATASET
2011-09-28 18:17 2463摘自:http://topic.csdn.net/t/2 ... -
VS设置使用哪个浏览器来调试网页
2011-08-30 16:57 1148摘自:http://zhidao.baidu.com/ques ... -
可使用js获取TREE的CheckBox
2011-08-20 12:32 1051摘自:http://www.uipower.com/bb ... -
正则表达式 验证邮箱
2011-06-02 18:14 2602正则表达式 摘自:http://www.alixixi.com ... -
未能加载程序集 App_Web_vdcnimdz”错误
2011-04-25 17:38 1556问题描述: 自己的一个WebGPS程序,只是拷到了别的 ... -
.net跳到指定错误页面兵显示详细的错误信息
2011-04-14 16:48 1224.net跳到指定错误页面兵显示详细的错误信息 摘自:h ... -
注册*.ocx控件
2011-04-14 11:23 896注册*.ocx控件 问题描述:本地的网站的bin目录下有了个 ... -
C# 读取文本文件的时候出现汉字乱码
2011-04-12 16:01 2346问题描述:C# 使用ReadAllText方法读取文本文件的时 ... -
VS 2008中如何显示代码的行号
2011-04-09 09:51 1191摘自:http://zhidao.baidu.com/ques ... -
VS.NET2008可以使用书签的功能
2011-04-08 17:19 1348摘自:http://blog.csdn.net/lmh_851 ... -
两个类库要添加引用才能使用
2011-04-02 13:57 1119两个类库要添加引用才能使用 ---------------- ... -
缓存 <%@ OutputCache Duration="6000" VaryByParam="none" %>
2011-04-02 10:53 1123在页首添加: <%@ OutputCache Durat ... -
FrameSet的加载顺序
2011-04-02 09:56 3855FrameSet的加载顺序是: (1) mainFrame ... -
Response.AddHeader “P3P”,”CP=CAO PSA OUR”
2011-04-01 18:01 2458摘自:http://my.donews.com/alor ... -
Hashtable 的使用
2011-03-31 09:36 7662011-3-31 Hashtable 的使用: ... -
google地图使用(二)
2011-03-30 10:30 12792011-3-291. 今天客户反映,说GOOGLE地图上的拖 ... -
GOOGLE地图
2011-03-29 18:31 7872011-3-291. 今天客户反映,说GOOGLE地图上的拖 ... -
此组中没有可用的控件 工具箱 vs2008
2011-03-29 09:20 2050问题描述: 此组中没有可用的控件 工具箱 vs2008 ...
相关推荐
C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例 C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例
(3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,...
c#中抽象类和接口。 相同点: (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 (4) 派生类必须实现未实现的方法 区 别: (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、...
4.实现抽象类和接口的类必须实现其中的所有方法。 抽象类中可以有非抽象方法。接口中则不能有实现方法。如果接口或者抽象类的子类不想实现则继续携程一个抽象方法 5.接口中定义的变量默认是public static final ...
c# 中抽象类和接口的学习
C#中抽象类和接口的区别.txt
抽象类与接口 抽象类与接口 抽象类与接口 抽象类与接口
抽象类和接口的区别
很多C#的初学者在编程时都容易把抽象类和接口搞混,本文就为大家从概念上讲解抽象类和接口的区别: ...接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1、不能实例化; 2、包含未实现的方法声明; 3、
描述了C#中两个重要的知识点,接口和抽象类,总结了它们的优点和缺点,并且进行了对比,介绍了什么情况下用接口什么情况下用抽象类
“抽象类允许(但不要求)抽象类包含抽象成员”。但是一个抽象类里不写抽象方法就没有意义了,既然如此,还不如直接写个普通类? 在一个抽象类里可以不声明抽象方法,这在语法上是没问题的,但实际来说,这样是没有...
抽象类和类成员 通过在类定义前面放置关键字 abstract,可以将类声明为抽象类。例如: public abstract class A { // Class members here. } 抽象类不能实例化。抽象类的用途是提供一个可供多个派生类共享的通用...
大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了=
c#中的抽象方法和抽象类,很适合初学者学习c#,虽然是一个Pdp,但还是有用的。内容简单易学
抽象类_接口_多态_继承整合案例.。
C#中abstract继承抽象类
接口和抽象类的各自讲解,以及其区别。包含c#和java中的接口和抽象类的对比。
练习使用接口和抽象类,实现一些基本的功能,适合初学者。
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。 在方法或属性声明中使用 abstract 修饰符以指示此方法或属性 不包含实现。 【抽象方法】具有以下特性: 抽象方法是隐式的 ...
C# C#语言基础和程序结构 数据类型:数组、结构和枚举 运算符、表达式和结构化程序 类的构造方法,继承,接口和抽象类 委托与事件 WindowsForm应用程序 XML操作等