面向对象编程三大特点  封装 继承 多态。今天我把自己学习多态的过程进行总结

多态 就是 同一个方法在不同情况下,会表选不同的效果(多个形态)。在代码上表现就是 同一个父类对象 赋予不同的子类对象 就会发生不同的效果。其本质就是 里氏转换

1、子类可以赋值给父类    2、如果父类中装的是子类对象,则可以将这个父类转换为对应的子类对象

作用:我们可以将所有的子类都当做是父类来看,针对父类进行编程,写出通用的代码,适应需求的不断改变。

父类 ss= new 子类();

注意  1、当1个父类变量指向了1个子类对象 只能通过这个父类变量调用父类的成员. 子类独有的成员无法调用.

多态有三种实现方法

--->虚方法

virtual override  //是普通的类,有意义的 可以创建对象

//如果子类重写了父类的虚方法. 那么通过父类变量来调用这个方法的时候 会调用子类的.

--->抽象类

abstract override   只能是抽象类,无意义的 不能创建对象

只声明方法,不去实现方法,让继承的类去实现(光说不做)

--->接口  Interface只定义方法,只定义规范,让实现这个接口的类,去实现里面的方法

多个类具有相同的行为但没有共同父类可以使用接口。

虚方法:很平常的类,只需要在需要重写的方法前面 添加 virtual ,就可以被子类重写,而virtual 本身所在的方法也是有意义,可以使用的。

例子:

class    Employee //父类
{
public virtual void DaKa()
{
Console.WriteLine("员工九点打卡");
}
}

class  Manager : Employee   //子类
{
public override void DaKa()
{
Console.WriteLine("经理11点打卡");
}
}

Employee emp = new Manager();

emp.DaKa();  // 经理11点打卡


抽象类:专门用来抽象出公共的方法和属性。进行共用的。所以他是无意义的,不能创建对象。只声明方法,不去实现方法,让继承的类去实现(光说不做),

抽象成员只能出现在抽象类中,抽象类中也可以有其他的普通成员。一个子类继承了一个抽象的父类,那么这个子类必须重写这个抽象父类中的所有抽象成员  所以当我们调用对象时    抽象类 ss= new 子类();     这个时候 我们所能调用的是父类的成员,但是子类重写的成员,就是子类重写后的

接口:接口是一种规范。也是一种能力。只要一个类继承了一个接口,这个类就必须实现这个接口中所有的成员。接口的功能要单一。也就是说,接口不能new(不能创建对象)。实现接口的子类必须实现该接口的全部成员。

一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA的前面。  class MyClass:A,IA{},因为类是单继承的。

例子:

class Driver : Person, IKouLan
{
public void KouLan()
{
Console.WriteLine("司机也可以扣篮");
}
} interface IKouLan //表示可以扣篮的一种能力
{
void KouLan();
} class NBAPlayer : Person
{
public void KouLan()
{
Console.WriteLine("NBA球员可以扣篮");
}
}
class Person
{
public void CHLSS()
{
Console.WriteLine("人类可以吃喝拉撒睡");
}
}

//实现多态
IKouLan kl = new Driver();//new Teacher();//new Student();
kl.KouLan();
Console.ReadKey();

经验:抽象类也可以继承接口,只要继承接口的都必要实现接口,所以抽象类也要实现接口。尽量不要出现这种情况让抽象类去实现接口,接口代表能力,子类有能力就实现接口,没能力就不去实现接口,如果都需要,那就直接写到父类中,不需要写到接口中让抽象类去实现。

 

最新文章

  1. SQLServer学习笔记系列12
  2. C++ 知道虚函数表的存在
  3. charles使用
  4. No.020:Valid Parentheses
  5. NSClassFromString 和 遍历UIView获取她所在的UIViewController的tips
  6. python+selenium+unittest,爬虫电影网站
  7. c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
  8. 锚点链接和hash属性
  9. BZOJ 2693: jzptab( 莫比乌斯反演 )
  10. winfrom SVG转Imge
  11. SpringBoot+Swagger整合API
  12. dns server 域名解析总结
  13. Hadoop生态圈-Ambari控制台功能简介
  14. Win10安装CAD2006
  15. ReactDom.render调用后没有渲染
  16. js,JavaScript,a标签onclick传递参数不对,A标签调用js函数写法总结
  17. ArcGIS API for Silverlight——小滑块
  18. mybatis 传参为 Integer 时 ,Mapper 文件 中判断 条件 问题。
  19. const 用法全面总结
  20. 关于easyUI一些标签的使用

热门文章

  1. Linux下系统版本查询命令
  2. Java入门笔记 07-枚举类
  3. C++模板详解(三):参数化声明详解
  4. AJAX技术初级探索
  5. Python学习(六)—— 函数、全局变量与局部变量
  6. python重要的日志模块logging
  7. QGridLayout栅格布局函数参数设置
  8. 服务器(2)——IIS(2)——IIS Express(1)——IIS跟IIS Express之间的区别和关系
  9. Vue 使用MD5 加密
  10. 吴裕雄--天生自然Numpy库学习笔记:NumPy 排序、条件刷选函数