摘要:提到面向对象就不得不说面向对象的三大特性,封装;继承;多态!下面还是通过图和例子的方式继续了解一下面向对象的三个核心!
下面还是通过具体的图进行分析:
通过代码来感受一下语法:
class Program { static void Main(string[] args) { Fu f1 = new Fu(); f1.GetFu(); //父类就只能获取到父类的属性方法,是不能获取到子类的方法的 zi z1 = new zi(); z1.GetZi(); //子类既可以获取到子类的方法属性,又可以获取到父类的属性和方法 z1.GetFu(); Console.ReadKey(); } } class Fu { public void GetFu() { Console.WriteLine("父类方法"); } } class zi:Fu //C#和C++不同,这里只能单继承 { public void GetZi() { Console.WriteLine("子类方法"); } }
通过图来看看继承的关系:
三.多态(一个对象可以有多种形态):
1.概念:是指一个名字可具有多种语义。在面向对象语言中,多态是在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法。
- 实现多态,有二种方式,覆盖,重载。
- 多态使我们可以把一个子类对象看作是一个父类对象类型
例:father A = new child()
2.多态分为两种:
- 编译时多态和运行时多态。
编译时类型:定义时类型(主观概念)把它看作什么。
运行时类型:真实类型(客观概念) 实际上他是什么。
重载又叫编译时多态;覆盖又称运行时多态。
3.运行时多态的三原则:
- 对象不变(改变的是主观认识)
- 对于对象的调用只能限于编译时类型的方法。
- 在程序的运行时,动态类型判定。运行时调用运行时类型,即他调用覆盖后的方法。
通过代码来感受一下语法:
class Program { static void Main(string[] args) { Fu f1 = new Zi(); Console.WriteLine(f1); f1.Show(); Zi z1 = new Zi(); Console.WriteLine(z1); z1.Show(); Console.ReadKey(); } } class Fu { public virtual void Show() //静态方法是不能重写的 { Console.WriteLine("父类的方法,在子类中将进行重写"); } } class Zi : Fu { public void SayHello(string name) { Console.WriteLine(name+"你好"); } public void SayHello(string name,string msg)//参数个数不同,和参数类型不同都可以构成重载 { Console.WriteLine(name + "你好: "+msg); } public override void Show() //重写了父类的方法 { Console.WriteLine("重写了父类的方法"); } //public new void Show() //当使用new关键字后在主函数中Fu的这个方法和Zi的这个方法成为了两个毫不相关的方法 //{ // Console.WriteLine("重写了父类的方法"); //} }
注意点:
- 多态是面向对象的重要特性之一,指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
- new重写实际上是对父类方法的隐藏,被覆盖的父类方法可以调用得到。因此new可以重写(或说是隐藏)的父类方法不一定要定义为虚方法或抽象方法。只是如果父类方法是虚方法或抽象方法时会覆盖父类方法,如果不是,则隐藏。
- 重载和覆盖的发生条件:
重载,必然发生在一个类中,函数名相同,参数类型或者顺序不同构成重载,与返回类型无关
重写,必然发生在基类和派生类中,其类函数用virtual修饰,派生类用override修饰
覆盖,在子类中写一个和基类一样名字(参数不同也算)的非虚函数,会让基类中的函数被隐藏,编译后会提示要求使用New关键字 new 修饰
隐藏,在子类中可以通过new 隐藏父类的方法 - new覆盖与重写、重载的区别:
当子类与父类的参数不同时当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载)
当基类函数是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载;因为参数不同,所以不是重写)
当子类与父类的参数相同时
当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载,因为基类不是虚函数,所以是隐藏不是重写)
当基类函数是虚函数时,基类函数将被覆盖。(因为子类和基类不在同一范围内,所以不是重载)
时间: 2024-10-12 22:06:42