一、 里氏替换原则--类型转换

1、 里氏替换原则:当需要一个父类类型对象的时候,可以给一个子类类型的对象。

2、 里氏替换原则实际也就是发生了隐身转换

3、  a.>把子类类型赋值给父类类型,发生了隐式类型。

b> 把父类类型变量赋值给子类类型,需要显式类型转换。

C>前提是如果这个父类类型变量p中,指向的确实是一个子类对象,则可以显式类型转换,如果p指向的不是子类的对象,则显式转换会报异常。(转换失败)    is-a可以用来验证继承关系中是否合理

4、 =======================as===================

//如果转换成功则将结果赋值给cn变量,

//如果转换失败也不报错,会将null值赋值给cn;

//最好在转换后,加一个cn是否为null的验证。

Chinese cn = per as Chinese;

if (cn!=null)

{

//做一些事情

}

//如果转换失败会报错!!!

Chinese cn1 = (Chinese)per;

============================================================================

/// <summary>

/// 父类类型作为参数的一种多态

/// </summary>

/// <param name="per"></param>

static void RenKouDengji(Person per)

{

per.DengJi();

}

多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

==============================================

//如果转换失败报异常

//Chinese newcn = (Chinese)per;

// Chinese newcn = per as Chinese;

////类型转换,如果转换成功,则newcn中为转换后的结果

////如果转换失败,则newcn为null

Chinese newcn = per as Chinese;

二、 抽象类

1、 抽象方法不能有任何方法体。(不能有任何实现)public abstract void Show();

2、 抽象成员必须写在抽象类中。不能写在一个实例中。这个类也必须标记为abstract(抽象的)。

3、 父类中的抽象成员,子类继承后必须重写(例外:除非子类也是一个抽象类)

4、 抽象类中可以有抽象成员

5、 抽象类是不能被实例化的。(抽象类的作用就是为了继承)

6、 抽象类的特点总结

1> 抽象成员必须标记为abstract,并且不能有任何实现。

2> 抽象成员必须在抽象类中。

3> 抽象类不能被实例化。

4> 子类继承抽象类后,必须把父类中的所有抽象成员都重写。(除非子类也是抽象类,则可以不用重写)

5> 抽象成员的访问修饰符不能是private

6> 在抽象类中可以包含实例成员

7> 抽象类是有构造函数的,虽然不能实例化

7、 什么时候用抽象类,什么时候用virtual虚方法

1> 如果父类中的方法有默认的实现,并且父类需要实例化,这是可以考虑将父类定义成一个普通类,使用virtual虚方法来实现多态。

2> 如果父类中的方法没有默认的实现,父类也不需要被实例化,则可以将该类定义为抽象类。

3> 类中的成员如果不写访问修饰符默认是私有的

8、 new关键字隐藏父类的成员(用的很少)

1> 表示在子类中隐藏了从父类继承过来的那个虚方法,

子类类型 obj = new 子类类型

2> 用new标记的方法是子类中的一个全新的方法,与从父类中继承过来的方法没有一点关系(断截了)

3> 不能多态了。

9、 简单工厂设计模式

各种设计模式的本质都是:多态。(充分理解多态,再看设计模式就会觉得轻松很多。)

三、 接口(使用规范,给接口起名字是以I开头,able结尾)

1、 什么是接口?

1> 接口就是一种规范.约定好遵守某种规范就可以写通用的代码。

2、 接口的语法特点

1> 接口中只能包含方法(方法,属性,索引器,事件);

2> 接口中的方法也不能有任何实现(就像抽象方法一样,直接加分号);

3> 接口中的成员不能有任何访问修饰符(哪怕是public),默认是public;

4> 接口不能被实例化;

5> 实现接口的类,必须实现接口中所有的成员;

3、 都已经有类实现多态了,为什还要接口呢?

(1) 继承具有单根性,不能多继承。接口却可以多实现。

(2) 接口的主要目的就是要实现多态。

(3) 当同一个类同时继承了某个类,并且也实现了某个接口的时候,必须要将继承的类写到第一个位置。

Public class Student : Person : IFlyable{}

(4) 当多个类型,都具有某个或某个功能时(方法),但是这几个类型又属于不同的系列(这几个类型没有共同的父类,这时就不能用抽象类了。),所以这时,为了实现多态就可以考虑把这几个类型的共有的方法提取到一个接口中,让这几个类型分别实现该接口。

(5) 如果一个类实现了一个接口,那么继承他的子类也会有接口里的内容。这个类的类型和这个类子类的类型都是他接口的类型(I…able)

4、 老师的建议:

建议:不要在一个接口中写过多的方法,避免造成接口污染。可以编写多个接口,在每个接口中,分别定义方法。(最终的是有还是要根据需求来定)

5、 显示实现接口:接口名.接口的方法IFlyable.Fly();

【基础知识】.Net基础加强第三天的更多相关文章

  1. Linux基础知识与基础命令

    Linux基础知识与基础命令 系统目录 Linux只有一个根目录,没有盘符的概念,文件目录是一个倒立的树形结构. 常用的目录功能 bin 与程序相关的文件 boot 与系统启动相关 cdrom 与Li ...

  2. Java基础知识二次学习--第三章 面向对象

    第三章 面向对象   时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...

  3. java线程基础知识----线程基础知识

    不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...

  4. day63:Linux:nginx基础知识&nginx基础模块

    目录 1.nginx基础知识 1.1 什么是nginx 1.2 nginx应用场景 1.3 nginx组成结构 1.4 nginx安装部署 1.5 nginx目录结构 1.6 nginx配置文件 1. ...

  5. 这些C++基础知识的基础知识你都学会了吗?

    一.C++基础知识 新的数据类型 C语言中的数据类型  C++中新的数据类型 思考:新的数据类型有什么好处?请看下面的代码:  可以见得:新的类型使整个程序更加简洁,程序变得易读易懂!这个就是bool ...

  6. 网络基础知识(一)wireshark 三次握手实践

    wireshark 三次握手简介 192.168.18.120 IP地址为我的本机虚拟机IP地址 过滤设置:ip.addr == 192.168.18.120 (ip.addr == 192.168. ...

  7. 【Unity3D游戏开发】基础知识之Tags和Layers (三二)[转]

    Tags和Layers分别表示是Unity引擎里面的标签和层,他们都是用来对GameObject进行标识的属性,Tags常用于单个GameObject,Layers常用于一组的GameObject.添 ...

  8. Ceph基础知识和基础架构认识

    1  Ceph基础介绍 Ceph是一个可靠地.自动重均衡.自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储.块设备存储和文件系统服务.在虚拟化领域里,比较常用到的是Cep ...

  9. Ceph 基础知识和基础架构认识

    1  Ceph基础介绍 Ceph是一个可靠地.自动重均衡.自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储.块设备存储和文件系统服务.在虚拟化领域里,比较常用到的是Cep ...

  10. 算法导论 - 基础知识 - 算法基础(插入排序&归并排序)

    在<算法导论>一书中,插入排序作为一个例子是第一个出现在该书中的算法. 插入排序: 对于少量元素的排序,它是一个有效的算法. 插入排序的工作方式像许多人排序一手扑克牌.开始时,我们手中牌为 ...

随机推荐

  1. 【leetcode 简单】 第七十七题 单词模式

    给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向 ...

  2. 免費域名申請.me .im .in .co .la .do .ms .kz .tk .ru .mu .pn .tt

    免費申請域名 .la .la 域名 – 原先是ICANN分配給老撾的國家頂級域名,不過後來被同時作為了美國洛杉矶市的域名後綴. 免費申請地址: http://www.idv.la http://www ...

  3. C++ Qt多线程 TcpSocket服务器实例

    服务器: incomming incomming.pro #------------------------------------------------- # # Project created ...

  4. 简单对象List自定义属性排序

    <body> <div> sort()对数组排序,不开辟新的内存,对原有数组元素进行调换 </div> <div id="showBox" ...

  5. weblogica 目录结构 简单介绍 创建domain domain所在目录

    1. samples 创建过程略过 domain的目录 [weblogic@node2 base_domain]$ pwd /home/weblogic/Oracle/Middleware/Oracl ...

  6. Spiral Matrix I & II

    Spiral Matrix I Given an integer n, generate a square matrix filled with elements from 1 to n^2 in s ...

  7. Interval Minimum Number

    Given an integer array (index from 0 to n-1, where n is the size of this array), and an query list. ...

  8. AngularJS中ng-class使用方法

    转自:https://blog.csdn.net/jumtre/article/details/50802136 其他博文ng-class使用方法:https://blog.csdn.net/sina ...

  9. 缓存数据库-redis数据类型和操作(sorted set)

    一:Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是 ...

  10. gitlab备份与还原

    1.备份 登录原服务器,执行命令: gitlab-rake gitlab:backup:create 备份后文件在如下目录,下载该文件 /var/opt/gitlab/backups 2.还原 先安装 ...