面向对象的三个基本特征
面向对象的三个基本特征是:封装、继承、多态。其中,封装 可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!
对象:万物皆对象
类:类就是具有相同的属性和功能的对象的抽象的集合
实例:对象就是类的实例
封装 |
什么是封装?
封装可以隐藏实现细节,使得代码模块化;在面向对象编程上可理解为:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
封装的意义?
封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。
保护数据成员,不让类以外的程序直接访问或修改,只能通过提供的公共的接口访问==>数据封装 。
方法的细节对用户是隐藏的,只要接口不变,内容的修改不会影响到外部的调用者==> 方法封装。
当对象含有完整的属性和与之对应的方法时称为封装。
从对象外面不能直接访问对象的属性,只能通过和该属性对应的方法访问。
对象的方法可以接收对象外面的消息。
封装时的权限控制符区别如下:
继承 |
什么是继承?
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。其继承的过程,就是从一般到特殊的过程。
通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承的实现方式?
继承概念的实现方式有三类:实现继承、接口继承和可视继承。
实现继承是指使用基类的属性和方法而无需额外编码的能力;
接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。
多态 |
什么是多态?
“一个接口,多种方法”,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
多态的三个条件?
a. 继承的存在(继承是多态的基础,没有继承就没有多态).
b. 子类重写父类的方法(多态下调用子类重写的方法).
c. 父类引用变量指向子类对象(子类到父类的类型转换).
重载(overload)和重写(override)是实现多态的两种主要方式。
实现多态?
接口多态性
继承多态性
通过抽象类实现的多态性
实际应用
动物运动会:叫声比赛
private void button1_Click(object sender, EventArgs e){Cat cat = new Cat("咪咪");//声明一个Cat的对象,对象名为cat,并将此cat对象实例化cat.ShoutNum = 5;MessageBox.Show(cat.Shout());//调用猫叫的方法}private void button2_Click(object sender, EventArgs e){Cat dog = new Cat("大黑");dog.ShoutNum = 5;MessageBox.Show(dog.Shout());}#region Cat类class Cat:Animal//猫类{public Cat():base(){ }public Cat(string name):base(name){ }//增加了override 表示方法重写public override string Shout()//猫叫的方法{string result = "";for (int i = 0; i < shoutNum; i++){result += "喵 ";}return "我的名字叫" + name + "" + result;}}#endregion#region Dog类class Dog : Animal//类{public Dog() : base(){ }public Dog(string name) : base(name){ }public override string Shout()//狗叫的方法{string result = "";for (int i = 0; i < shoutNum; i++){result += "汪 ";}return "我的名字叫" + name + "" + result;}}#endregion#region Animal类class Animal{protected string name = "";//声明Animal类的受保护的字符串变量namepublic Animal(string name){this.name = name;//定义Animal的构造方法,参数是输入一个字符串}public Animal(){this.name = "无名";//将构造方法重载}//默认叫的次数是3//ShoutNum属性,注意是public,当中有两个方法get表示外界调用时可以得到shoutNum的值//set表示外接调用时恶意给内部的shoutNum赋值protected int shoutNum = 3;public int ShoutNum{get{return shoutNum;}set{shoutNum = value; }}//修饰符中增加了一个virtual,它表示此方法是虚方法,可以被子类重写public virtual string Shout(){return "";}}#endregion//“动物报名”的按钮事件//声明一个动物数组private Animal[] arrayAnimal;private void button3_Click(object sender, EventArgs e){//实例化最多可报名5个的动物数组对象arrayAnimal = new Animal[5];//报名的分别是猫,狗,狗,猫,猫arrayAnimal[0] = new Cat("小花");arrayAnimal[1] = new Dog("阿毛");arrayAnimal[2] = new Dog("小黑");arrayAnimal[3] = new Cat("大胖");arrayAnimal[4] = new Cat("咪咪");}//叫声比赛的按钮事件private void button4_Click(object sender, EventArgs e){//遍历这个数组,让它们都Shout()foreach(Animal item in arrayAnimal){//由于有了多态性,所以叫的时候,程序会自动去找item是什么对象,然后用哪个重写方法MessageBox.Show(item.Shout());}}