前言
封装,继承,多态是面向对象的三大特性中的前两个特性。封装让类与类之间耦合度大大降低,继承可以是代码精简。
封装
每个对象都包含它能进行操作所需要的所有信息,因此对象不必依赖其他对象来完成自己的操作。就像一个房子的墙一样,隔绝了房子内部与外界的联系,而类中的public方法和属性,就是这栋房子的门和窗,起到对外连接的作用。
优点
1、减少耦合。
2、类内部自由修改。
3、类具有清晰的对外接口。
继承
对象的继承代表一种“is-a”的关系,继承者是对被继承者的特殊化,除了具备被继承者的特性外,它还有自己的特性。通俗点说,就是,企鹅是鸟,那么企鹅就继承了鸟的特征,但是它有自己的特征,他不会飞。
要点
如果子类继承父类:
1、子类拥有父类非private的属性和功能。
2、子类具有自己的属性和功能。
3、子类还可以用自己的方式实现父类的功能(方法重写)。
例子
前面说道,让有名字的猫叫,现在又有一个新的要求,让狗也叫。当我们实现了代码后,会发现这两个程序代码相似度特别高,这就违反了我们编程的原则,这时候该怎么办呢?对,继承,我们要把相同的代码,尽可能的放到父类中去,让子类去继承。
class Animal
{
protected string name = "";
public Animal(string name)
{
this.name = name;
}
public Animal()
{
this.name = "无名";
}
protected int shoutNum = 3;
public int ShoutNum
{
get{return shoutNum;}
set{shoutNum = value;}
}
}
然后,我们就要写子类,让他们去继承Animal。这样,重复的代码我们就可以不用写了,如果再有需求,让一个小兔子叫两声,我们只需要写一个子类去继承Animal就行了(兔子怎么叫不要问我,人艰不拆)。在C#中,子类从父类中继承的成员有方法,属性,事件,索引指示器,但对于构造方法,它不能被继承,只能被调用,这也就是我们在做设计模式的例子时遇到的base关键字。下面,我举个例子,让我们的小狗去叫。
class Dog : Animal
{
public Dog() : ()
{}
public Dog(string name) : base(name)
{}
public string Shout()
{
string result = "";
for (int i = 0; i < shoutNum; i++)
result += "汪,";
return "我的名字叫:" + name + " " + result;
}
}
这样,我的狗就可以愉快的叫了。
用了继承,重复的代码减少了,而且,使我们的修改变得很容易。但是,继承也是有缺点的,就是父类变,子类不得不变,而且会使父类和子类的耦合度变大。
那么又要问了,社么呢时候用继承会好呢?当两个类具备“is a”的关系时,就可以用继承,但当两个类是“has a”时,就不能用继承了,比如,我有一个大脑袋,大脑袋就不能继承我了。
总结
封装继承是我们在学习面向对象语言时最基础的思想,也是最重要的思想,它让我们的代码变的简洁易维护,在以后的博客中,还会提到面向对象的第三大特性,多态。