上一次,我们了解了委托,委托和Lambda表达式结合是一件灰常灰常爽的事情,这也是只有.Net才有,自己偷着笑去吧。几天这次,我要介绍一下继承和多态,这是进行面向对象编程必须熟练掌握的技术和思想。
1.1 类
继承,儿子继承父亲的遗产,这是生活中的体现,在面向对象的编程中,父亲和儿子都是对象的抽象集合,也就是类。什么是类呢?就是一些具有共同特征的对象集合,例如:狗都有四条腿,一条尾巴,两只眼睛,狗都会游泳,都爱吃骨头,所以我们把具有以上特征的动物抽象成狗,我们进行面向对象编程也是这样,面向对象的程序员必须具备抽象的能力。
1.1.1 字段
字段在类中属于封装的部分,一般是私有成员变量或常量,如:
private int _num1; private bool _dispose;
_num1与 _dispose都是所属类的字段。
1.1.2 属性
属性是类的静态特征,如狗的腿有几条,眼睛有几只,都是狗的属性,在面向对象的编程中,属性是对字段封装,如:
private int _num1; public int Num1 { get { return _num1; } set { _num1 = value; } } private bool _dispose; public bool Dispose { get { return _dispose; } set { _dispose = value; } }
Num1和Dispose都是所属类的属性,他们对各自的字段进行了封装,有的属性是只读的,还有的属性只能在构造函数中进行赋值,以后不可以修改,如下:
private int _dogColor; /// <summary> /// 只读属性:狗的颜色 /// </summary> public int DogColor { get { return _dogColor; } } private string _pid; /// <summary> /// 只能在构造函数中赋值属性:身份证号 /// </summary> public string PID { get { return this._pid; } private set { this._pid = value; } }
1.1.3 方法
方法是类的行为能力,例如狗游泳,吃骨头,这都是狗的行为能力,在面向对象编程中,方法的结构是这样的:
/// <summary> /// 狗默默的吃方法,默默的所以是私有的 /// </summary> private void Eat() { Console.WriteLine("真好吃啊!"); } /// <summary> /// 狗游泳,判断狗是否游过了river河 /// </summary> /// <param name="dogName">狗的名字</param> /// <param name="river">河的名字</param> /// <returns></returns> public bool Swim(string dogName,string river) { bool isSwim = false; if (!string.IsNullOrEmpty(river)) { Console.WriteLine(dogName + "游过了" + river); isSwim = true; } return isSwim; }
Eat和Swim都是狗类的方法,Eat方法没有参数没有返回值,Eat方法是私有的,只有狗类内部可以访问Eat方法;Swim方法有两个string类型参数,第一个参数是狗的名字,第二个参数是狗要游过的河流,返回bool类型判断狗是否游过了该河流,Swim方法是公有的,所有狗对象都可以访问Swim方法,关于private、protected、public的访问权限可以仔细阅读微软官方的MSDN帮助文档进行深入研究,不难理解,在这里我就不过多介绍了,到此关于类的介绍就这些了,下面继续介绍面向对象的核心知识之一——继承。
1.2 继承
1.2.1 继承的原理
继承是建立在类的基础上,具体类实现接口也可以叫做继承,在C#中一个类只能继承一个类,即不支持多重继承,生活中也是这样,一个人只能有一对亲生父母;但是C#中一个类可以实现多个接口,实现接口可以理解为,我们学习了新的本领,如,我们学会了说话,我们就实现了说话的接口,我们学会了写代码,我们就实现了写代码的接口。
可以看出,我们进行面向对象编程,就是模拟生活制作生活,所以一个好的程序员必定是一个美好生活的缔造者,广大女同胞们要注意了,选老公一定要选程序员,选择了程序员,你的后半生就幸福了,哈哈哈。
C#中的继承是这样的:
/// <summary> /// 产品类 /// </summary> public class Product { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } } /// <summary> /// 发出声音接口 /// </summary> public interface Sound { bool MakeNoise(); } /// <summary> /// 显示图片接口 /// </summary> public interface ShowImage { void Show(string path); } public class NewProduct : Product, Sound, ShowImage { #region NewProduct类新成员 private string _color; public string Color { get { return _color; } set { _color = value; } } private void ChangeColor() { Console.WriteLine("颜色真的变了耶!"); } #endregion #region Sound 成员 public bool MakeNoise() { Console.WriteLine("哇塞,声音好大啊!"); return true; } #endregion #region ShowImage 成员 public void Show(string path) { Console.WriteLine("哎呦,来自{0}图片太漂亮了!",path); } #endregion }
从上面代码可以看出,接口没有方法的具体实现,接口方法的具体实现代码在继承该接口的类中实现,但要保持签名一致。
在面向对象的编程中,子类具有父类的所有特征,可以理解为子类是父类的扩展,父类里的所有非私有属性和非私有方法子类都可以访问。
1.2.1 继承的使用
实现接口也属于继承,那么什么时候继承类,什么时候继承接口呢?从程序的可扩展型和复用性考虑,为了松耦合度,只有有明确的父子关系的两个类才使用继承类,而实现接口在程序设计模式中经常用到,易于扩展。
比如,策略模式,对算法进行封装,经常用接口定义方法,然后具体类中具体实现,调用时由Context统一调用,在程序设计中使用适当的设计模式又是一件非常非常爽的事情,关于设计模式,我在这里也不多介绍,如果想深入了解,可以观看吕建中的官方视频,也可以看《大话设计模式》这本书,看完之后,你会感觉更爽。
1.3 多态
多态按字面的意思就是“多种状态”。在面向对象编程中,接口的多种不同的实现方式即为多态。其实多态更像是一种思想,不同实体实现同一接口是多态,重载函数方法是多态,方法重写是多态等等,多态就是对同一功能有不同的实现方式,关于多态理解其中的思想是最为重要的,在面向对象编程中灵活运用多态那也是非常非常爽的一件事。
继承多态总结:今天介绍的东西似乎有点多,其实不多,这些都是进行面向对象开发必须掌握的东西,如果你对上面说的内容感觉很陌生,那么你目前是不适合做移动开发的,你最应该的马上补充一下这是知识空白,当然面向对象的编程基础远不止这些,所以要想成为一流的开发人员,修炼是必不可缺的了。
好了,不在得瑟了,今天就到这里,下次还有更爽的,敬请期待。我们下次见。