本文将介绍如下内容:程序员
• 面向对象思想:多态编程
• 接口设计模式
• 抽象类ide
1. 引言函数
在我以前的一篇post《抽象类和接口的谁是谁非》中,和同事管伟的讨论,获得不少朋友的关注,由于是不成体系的论道,因此给你们了解形成不便,同时关于这个主题的系统性理论,我认为也有必要作以总结,所以才有了本篇的新鲜出炉。同时,我将把上贴中的问题顺便也在此作以交代。post
2. 概念引入学习
接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR容许接口能够包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。可是注意:C#中不能包含任何静态成员。一个类能够实现多个接口,当一个类继承某个接口时,它不只要实现该接口定义的全部方法,还要实现该接口从其余接口中继承的全部方法。this
定义方法为:设计
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); } } }
抽象类提供多个派生类共享基类的公共定义,它既能够提供抽象方法,也能够提供非抽象方法。抽象类不能实例化,必须经过继承由派生类实现其抽象方法,所以对抽象类不能使用new关键字,也不能被密封。若是派生类没有实现全部的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。对象
定义方法为:
/// <summary> /// 定义抽象类 /// </summary> abstract public class Animal { //定义静态字段 protected int _id; //定义属性 public abstract int Id { get; set; } //定义方法 public abstract void Eat(); //定义索引器 public string this[int i] { get; set; } } /// <summary> /// 实现抽象类 /// </summary> public class Dog: Animal { public override int Id { get {return _id;} set {_id = value;} } public override void Eat() { Console.Write("Dog Eats.") } }
3. 相同点和不一样点
3.1 相同点
3.2 不一样点
经过相同与不一样的比较,咱们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,咱们要视具体状况来酌情量才,可是如下的经验和积累,或许能给你们一些启示,除了个人一些积累以外,不少都来源于经典,我相信经得起考验。因此在规则与场合中,咱们学习这些经典,最重要的是学以至用,固然我将以一家之言博你们之笑,看官请继续。
3.3 规则与场合
以上的规则,我就厚颜无耻的暂定为T14条吧,写的这么累,就当一时的奖赏吧。你们也能够互通有无,我将及时修订。
4. 经典示例
4.1 绝对经典
.NET Framework是学习的最好资源,有意识的研究FCL是每一个.NET程序员的必修课,关于接口和抽象类在FCL中的使用,我有如下的建议:
4.2 别样小菜
下面的实例,由于是个人理解,所以给经典打上“相对”的记号,至于何时晋升为“绝对”,就看我在.NET追求的路上,是否可以一如既往的如此执着,所以我将把相对重构到绝对为止(呵呵)。 本示例没有阐述抽象类和接口在设计模式中的应用,由于那将是另外一篇有讨论价值的文本,本文着眼与概念和原则的把握,可是真正的应用来自于具体的需求规范。
设计结构如图所示:
1. 定义抽象类
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!"); } }
2. 定义接口
public interface IAction { //定义公共方法标签 void Move(); }
3. 实现抽象类和接口
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."); } }
4. 客户端实现
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(); } }
5. 他山之石
正所谓真理是你们看出来的,因此将园子里有创新性的观点潜列于此,一是感谢你们的共享,二是完善一家之言的不足,但愿可以将领域造成知识,受用于我,受用于众。
最后,MSDN的建议是:
6. 结论
接口和抽象类,是论坛上、课堂间讨论最多的话题之一,之因此将这个老话题拿出来再议,是由于从个人体会来讲,深入的理解这两个面向对象的基本内容,对于盘活面向对象的抽象化编程思想相当重要。本文基本概况了接口和抽象类的概念、异同和使用规则,从学习的观点来看,我认为这些总结已经足以表达其核心。可是,对于面向对象和软件设计的深刻理解,仍是创建在不断实践的基础上,Scott说本身天天坚持一个小时用来写Demo,那么咱们是否是更应该勤于键盘呢。对于接口和抽象类,请多用而知其然,多想而知其奥吧。