继承和多态是最能体现面向对象的特性的,继承说明了类与类之间,类与接口之间的关系,而多态则继承性功能的扩展,通过多态更能体现继承机制的优势,同时也体现了面向对象的优越性。
继承是面向对象最主要的特性之一,同时也继承了类之间的关系,类和类之间是可以通过继承关联在一起的,在继承的同时也继承了相应的特性
继承热性在现实中是无处不在的,世界上的诸多事物都有其相似的属性。苹果和鸭梨两者都可以使用,都富含某种营养元素,再如客车和轿车,两者都是四个轮子,都是代替人步行的工具,都是使用方向盘等。所以,在为了方便管理,人们就把具有相似性的事物归为一类,如果苹果和鸭梨都属于水果,在客车和轿车都属于汽车。
在C#中,被继承的类被称为基类或者父类,继承了基类的类称为子类或者派生类,类之艰难的继承关系是通过冒号实现的。冒号前是派生类,后面的是基类
比如- class 基类名字
- {
- 类的成员
- }
- class 派生类:基类
- {
- 类的成员
- }
复制代码 虽然派生类继承了基类的属性和方法,但是有时还是需要访问基类的某些成员。使用base关键字可以访问基类成员,报考基类的属性和方法,但是这些属性和方法必须是共有的
下面写一个例子- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace aaa
- {
- class Program
- {
- static void Main(string[] args)
- {
- Circular circular = new Circular();
- Console.WriteLine("圆的面积是:",circular.getArea().ToString());
- }
- }
- class graph
- {
- public double PI = Math.PI;
- public int r = 12;
-
- }
- class Circular : graph
- {
- public double getArea()
- {
- double area = base.PI * base.r * base.r;
- return area;
- }
- }
- }
复制代码 多态是面向对象中最重要的概念之一,是指对同一个对象进行相同的操作,而最后产生不同的结果。多态性分为编译时多态和运行时多态两种。
例如苹果和鸭梨都属于水果类,两者都具有吃的特性,但是吃苹果核鸭梨的味道又有所不同,这就产生了多态性。对于苹果类来谁也是如此,如果有两个苹果,都属于苹果类,苹果的重量和色泽都属于苹果的属性,但是两个的苹果的的重量和色泽可能都不同这样就会产生两个多态性。
编译时多态——重载
编译时多态是指在编译时就会产生想多方法不同函数,是听过重载来实现的,编译时多态分为方法重载和操作符重载
方法重载是指同一个方法名具有多个不同类型或者个数的参数的函数,如果计算不同的圆形的面积和周长其方法也是不一样的,传递的参数也不一样- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace aaa
- {
- class Program
- {
- static void Main(string[] args)
- {
- graph a = new graph();
- double a1 = a.getArea(20);
- double a2 = a.getArea(20, 50);
- Console.WriteLine("圆的面积是:{0}",a1);
- Console.WriteLine("矩形的面积是:{0}",a2);
- Console.ReadLine();
- }
- }
- class graph
- {
- public double getArea(double r)//计算圆的面积
- {
- double area = Math.PI * r * r;
- return area;
- }
- public double getArea(double x, double y)//计算矩形面积
- {
- double area = x * y;
- return area;
- }
-
- }
-
- }
复制代码 我们调用同一个方法,getArea(),传递不同的参数,执行的方法也就不同。
运行是多态——重写
运行是多态则是在程序运行过程中一句具体情况来实现不同的操作,是通过重写虚拟成员来实现的,基类中需要重写的的函数使用关键字virtual定义,该关键字被放在返回类型的前面,二派生类如果要冲虚虚函数,则是要送样override,该关键字也是放在返回类型的前面- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace aaa
- {
- class Program
- {
- static void Main(string[] args)
- {
- Circular cir = new Circular();
- double a1 = cir.getArea();
- Rectangle rec = new Rectangle();
- double a2 = rec.getArea();
- Console.WriteLine("圆的面积是:{0}",a1);
- Console.WriteLine("矩形面积是:{0}",a2);
- Console.ReadLine();
-
- }
- }
- class graph
- {
- public virtual double getArea()
- {
- return 0;
- }
-
- }
- class Circular : graph
- {
- public override double getArea()
- {
- return 100;
- }
- }
- class Rectangle : graph
- {
- public override double getArea()
- {
- return 120;
- }
- }
-
- }
复制代码 |