一、封装
良好的封装能够减少耦合;类内部的实现可以自由地修改;类具有清晰的对外接口。比如建立一个猫的类,再建立一个狗的类,这样也算封装,只是会出现大量相似代码。
二、继承继承的出现是因为对象类中出现过多重复代码,为解决该问题而建立父类,将这部分代码放进父类中,由子类继承。子类继承父类的所有特性,同时可以定义新的特性。
如果子类继承于父类,子类拥有父类非private的属性和功能;子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;子类还可以以自己的方式实现父类的功能(方法重写)。
class Animal //父类 { protected string name = ""; //字段,修饰符意味子类可以继承 public Animal(string name) //构造函数 { this.name = name; } protected int shoutNum = 3; //属性及其设置方法 public int ShoutNum { get { return shoutNum; } set { shoutNum = value; } } public virtual string Shout() //父类方法,注意增加的虚拟修饰符代表该方法允许被子类重写 { return ""; } }class Cat : Animal //子类,继承自父类 { public Cat(string name) : base(name) //继承父类的构造函数,构造函数不能被继承,只能被调用 { } public override string Shout() //重写父类的方法 { string result = ""; for (int i = 0; i < shoutNum; i++) result += "喵 "; return "我的名字叫" + name + " " + result; } }继承的优点:代码共享,避免重复,可使得修改或扩展继承而来的实现都较为容易;
继承的缺点:父类变子类变,继承会破坏包装,父类实现细节暴露给子类,显然是一种类与类之间强耦合的关系。
总结:继承适用情况是两个类具备‘is-a’的关系时,即完全包含。
三、多态
多态表示不同的对象可以执行相同的动作,但要通过自己的实现代码来执行,第二节中的父类和子类的重写方法即是多态的表示。
virtual关键字可以使用的范围:属性、事件、方法和索引器,但是字段不能虚拟。子类可以选择使用override关键字重写父类的方法。
private void button1_Click(object sender, EventArgs e) //客户端调用 { Animal cat ; //声明时要声明父类 cat = new Cat("小咪"); //实例要实例为子类 cat.ShoutNum = 5; //执行子类重写后的方法 MessageBox.Show(cat.Shout()); }
四、衍生:重构
重构都是在程序编写过程中发现大量重复代码,因而对现有代码进行重新编写,提取重复部分融入或新建父类的。在父类中需要子类完全继承的方法不要添加virtual关键字,使其成为普通方法,而需要子类自行定义的方法定义成虚方法。