最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
对抽象编程:接口和抽象类
时间:2011-03-07 编辑:简简单单 来源:一聚教程网
1. 引言
在我之前的一篇post 《抽象类和接口的谁是谁非 》中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉。同时,我将把上贴中的问题顺便也在此做以交代。
2. 概念引入
- 什么是接口?
- public interface system.icomparable
- {
- int compareto(object o);
- }
-
- public class testcls: icomparable
- {
- public testcls()
- {
- }
-
- private int _value;
- public int value
- {
- get { return _value; }
- set { _value = value; }
- }
-
- public int compareto(object o)
- {
-
- //使用as模式进行转型判断
- testcls acls = o as testcls;
- if (acls != null)
- {
-
- //实现抽象方法
- return _value.compareto(acls._value);
- }
- }
- }
- 什么是抽象类?
- ///
- /// 定义抽象类
- ///
- abstract public class animal
- {
- //定义静态字段
- protected int _id;
-
- //定义属性
- public abstract int id
- {
- get;
- set;
- }
-
- //定义方法
- public abstract void eat();
-
- //定义索引器
- public string this[int i]
- {
- get;
- set;
- }
- }
-
- ///
- /// 实现抽象类
- ///
- public class dog: animal
- {
- public override int id
- {
- get {return _id;}
- set {_id = value;}
- }
-
- public override void eat()
- {
- console.write("dog eats.")
- }
- }
- 都不能被直接实例化,都可以通过继承实现其抽象方法。
- 都是面向抽象编程的技术基础,实现了诸多的设计模式。
- 接口支持多继承;抽象类不能实现多继承。
- 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
- 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
- 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
- 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
- 接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,struct 就可以继承接口,而不能继承类。
- 请记住,面向对象思想的一个最重要的原则就是:面向接口编程。
- 借助接口和抽象类,23 个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。
- 抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
- 接口着重于can-do 关系类型,而抽象类则偏重于is-a 式的关系;
- 接口多定义对象的行为;抽象类多定义对象的属性;
- 接口定义可以使用public 、protected 、internal 和private 修饰符,但是几乎所有的接口都定义为public ,原因就不必多说了。
- “ 接口不变” ,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。
- 尽量将接口设计成功能单一的功能块,以.net framework 为例,idisposable 、idisposable 、icomparable 、iequatable 、ienumerable 等都只包含一个公共方法。
- 接口名称前面的大写字母“i” 是一个约定,正如字段名以下划线开头一样,请坚持这些原则。
- 在接口中,所有的方法都默认为public 。
- 如果预计会出现版本问题,可以创建“ 抽象类” 。例如,创建了狗(dog )、鸡(chicken )和鸭(duck ),那么应该考虑抽象出动物(animal )来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。
- 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
- 对抽象类不能使用new 关键字,也不能被密封,原因是抽象类不能被实例化。
- 在抽象方法声明中不能使用 static 或 virtual 修饰符。
- fcl 对集合类使用了基于接口的设计,所以请关注system.collections 中关于接口的设计实现;
- fcl 对数据流相关类使用了基于抽象类的设计,所以请关注system.io.stream 类的抽象类设计机制。
- public abstract class animal
- {
- protected string _name;
-
- //声明抽象属性
- public abstract string name
- {
- get;
- }
-
- //声明抽象方法
- public abstract void show();
-
- //实现一般方法
- public void makevoice()
- {
- console.writeline("all animals can make voice!");
- }
- }
- public interface iaction
- {
- //定义公共方法标签
- void move();
- }
- public class duck : animal, iaction
- {
- public duck(string name)
- {
- _name = name;
- }
-
- //重载抽象方法
- public override void show()
- {
- console.writeline(_name + " is showing for you.");
- }
-
- //重载抽象属性
- public override string name
- {
- get { return _name;}
- }
-
- //实现接口方法
- public void move()
- {
- console.writeline("duck also can swim.");
- }
-
- }
-
- public class dog : animal, iaction
- {
- public dog(string name)
- {
- _name = name;
- }
-
- public override void show()
- {
- console.writeline(_name + " is showing for you.");
- }
-
- public override string name
- {
- get { return _name; }
- }
-
- public void move()
- {
- console.writeline(_name + " also can run.");
- }
-
- }
- public class testanmial
- {
- public static void main(string [] args)
- {
- animal duck = new duck("duck");
- duck.makevoice();
- duck.show();
-
- animal dog = new dog("dog");
- dog.makevoice();
- dog.show();
-
- iaction dogaction = new dog("a big dog");
- dogaction.move();
- }
- }
相关文章
- Java中Math类常用方法代码详解 07-29
- 阴阳师手游拉条类式神有哪些 07-19
- 烧脑小怪兽illi益智类手游AppStore限免中 07-17
- 查看import的类是出自哪个jar包的方法 07-01
- LED是什么意思 LED有哪些种类 06-30
- 艳阳下的运动精神 体育类手游推荐 06-15