Csharp中的关键字示例及代码演示之接口
2011-10-14 15:55
330 查看
接口(Interface):
在以往我们对接口(Interface)的理解中,可以说接口就是一种契约,定义了遵守该契约的签名。
当然,接口和前面所说的抽象类很相似,不能被实例化,被继承时派生类必须实现接口中的签名。但是抽象类是特殊的类,只能是单继承,而接口可以多继承,接口可以包含属性,事件,索引器和方法(此方法不能包含实现的code)。实例1:
Interface and Virtual Class
很多时候,关于接口和抽象类的区别的文章不胜枚举,但是仍有很多疑惑,什么时候该用接口,什么时候该用抽象类呢?我们说接口是一个契约,是一组规则,继承接口的派生类或接口要遵守该接口的约束。比如上面实现的Animal类和IAnimal接口。也就是说,Animal类继承了IEat接口,那就必须要实现该接口所包含的Eat()方法。关于抽象类,强调更多的是共性,如所有实现了Animal类的动物都要吃,所以可以写一个抽象类的抽象方法,然后继承该类的Animal就都可以去KFC了,哈哈。另外,接口是不同类对象之前的行为抽象。抽象类是同类对象之间存在的抽象。
判断应用Interface or Virtual Class的原则
Is-A 与 CAN-DO关系,一个类型仅可以继承一个实现,如果基类和派生类有一个Is-A关系,就可以考虑用抽象类,也就像我们的Dog类和Animal类一样,我们可以说狗是动物,但不能说动物是狗,千万别!!这个就是Is-A的关系. 接口隐含一个CAN-DO关系,如果认为CAN-DO功能属于多个类型,就使用接口。
易用性。我们使用计算机的目的就是为了简单,方便(我这么想的,就目前计算机的作用不仅仅是这样的”简单“了)如果你的程序让测试的同事都无法忍受,那你还期望客户给你Silme么?当然在不影响性能与功能的前提下,代码越简单越好。有些地方感觉用抽象类或是接口都可以,那么为何不使用抽象类?!你要清楚,要重新创建接口,并且还要实现接口中的所有方法,还不能共享大量的代码,谁让你继承了呢?!
应用场景的不同才是抽象类和接口的区别的根本。项目是应需求而生的,有什么样的需求,然后再这样的场景下利用最合适的技术才是王道。
以上属个人观点,如有疑问可参与讨论。
在以往我们对接口(Interface)的理解中,可以说接口就是一种契约,定义了遵守该契约的签名。
当然,接口和前面所说的抽象类很相似,不能被实例化,被继承时派生类必须实现接口中的签名。但是抽象类是特殊的类,只能是单继承,而接口可以多继承,接口可以包含属性,事件,索引器和方法(此方法不能包含实现的code)。实例1:
/* * ${res:XML.StandardHeader.CreatedByYangbo} * 用户: ${YangBo} * 日期: 10/14/2011 * 时间: 13:50 * */ using System; using InterFaceTestDemo; namespace InterFaceTestDemo { //接口可以多继承 public class Animal:IAnimal,IEat { private string name; private Int32 age; public Animal(string name,Int32 age) { this.age=age; this.name=name; } public String Name { get { return name; } set { name=value; } } public Int32 Age { get { return age; } set { age=value; } } //接口可以包含方法 public interface IEat { void Eat(); } //可以包含索引器 public interface INum { Int32 this[Int32 index] {get;set;} } //接口可以包含属性 public interface IAnimal { String Name {get;set;} Int32 Age {get;set;} } //包含事件 public interface IEvent { event EventHandler IsDog; } public class Dog:INum,IEvent { event EventHandler IsDog; private void IsDog() { //ToDO: Something for this Function } private Int32[] arr=new Int32[100]; public Int32 this[Int32 index] { get { return arr[index]; } set { arr[index]=value; } } } public static void Main() { Animal an=new Animal("Duck",2); Console.WriteLine("name is {0},age is {1}",an.Name,an.Age); Dog dog=new Animal.Dog; Random ad=new Random(100); for (int i = 0; i < 10; i++) { dog[i]=ad.Next(); Console.WriteLine("The Elements #{0}={1}",i,dog[i]); } } } }
Interface and Virtual Class
很多时候,关于接口和抽象类的区别的文章不胜枚举,但是仍有很多疑惑,什么时候该用接口,什么时候该用抽象类呢?我们说接口是一个契约,是一组规则,继承接口的派生类或接口要遵守该接口的约束。比如上面实现的Animal类和IAnimal接口。也就是说,Animal类继承了IEat接口,那就必须要实现该接口所包含的Eat()方法。关于抽象类,强调更多的是共性,如所有实现了Animal类的动物都要吃,所以可以写一个抽象类的抽象方法,然后继承该类的Animal就都可以去KFC了,哈哈。另外,接口是不同类对象之前的行为抽象。抽象类是同类对象之间存在的抽象。
判断应用Interface or Virtual Class的原则
Is-A 与 CAN-DO关系,一个类型仅可以继承一个实现,如果基类和派生类有一个Is-A关系,就可以考虑用抽象类,也就像我们的Dog类和Animal类一样,我们可以说狗是动物,但不能说动物是狗,千万别!!这个就是Is-A的关系. 接口隐含一个CAN-DO关系,如果认为CAN-DO功能属于多个类型,就使用接口。
易用性。我们使用计算机的目的就是为了简单,方便(我这么想的,就目前计算机的作用不仅仅是这样的”简单“了)如果你的程序让测试的同事都无法忍受,那你还期望客户给你Silme么?当然在不影响性能与功能的前提下,代码越简单越好。有些地方感觉用抽象类或是接口都可以,那么为何不使用抽象类?!你要清楚,要重新创建接口,并且还要实现接口中的所有方法,还不能共享大量的代码,谁让你继承了呢?!
应用场景的不同才是抽象类和接口的区别的根本。项目是应需求而生的,有什么样的需求,然后再这样的场景下利用最合适的技术才是王道。
以上属个人观点,如有疑问可参与讨论。
相关文章推荐
- Csharp中的关键字示例及代码演示之类
- Csharp中的关键字示例及代码演示之结构
- android 三种网络通信接口及各个接口的代码示例
- 黑马程序员—Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- 天气查询接口演示代码
- 微信支付V2账单查询接口orderquery示例代码
- CityMaker学习教程07 示例代码的使用CSharp
- 火车票演示示例及返回示例代码
- 微信简易开发接口示例代码
- Python实现登录接口的示例代码
- RateLimit-使用guava来做接口限流代码示例
- socket示例代码演示程序(螺纹)
- 星座查询演示示例代码
- Java8函数接口实现回调及Groovy闭包的代码示例
- php版淘宝网查询商品接口代码示例
- Flex之视窗状态 ------ 示例代码演示
- 在Eclipse和STS集成Cloud Foundry开发环境,spring + MongoDB 示例代码演示部署(一)
- .NET调用新浪微博开放平台接口的代码示例
- 演示Session对象使用 范例(示例代码下载)
- 快递鸟物流查询接口API调用代码示例