.NET知识梳理——3.面向对象
1. 面向对象
1.1 封装、继承、多态理解
1.1.1 封装
封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。降低耦合、提高重用性。
1.1.2 继承
子类拥有父类的一切属性和行为。可以实现代码的重用,.NET中类只能单继承。
1.1.3 多态
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态按照不同的维度有以下几种:
1.1.3.1 编译时多态
编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。重载只是针对一个类内部的几个参数不同,名称相同的方法。
1.1.3.2 运行时多态
运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中运行时的多态性是通过覆写虚成员实现。
1.1.3.3 接口多态
一个类可以实现多个接口。
1.1.3.4 继承多态
一个基类可以扩展多个子类。
1.2 覆写override、重载overload
1.2.1 覆写override
子类对父类虚方法、抽象方法的重新实现。子类对父类的虚方法可重写也可不重写,对父类的抽象方法,必须重写,都需要用override关键字修饰,如下:
/// <summary>
/// 父类,抽象类
/// </summary>
public abstract class ParentClass
{
public ParentClass(string name)
{
Console.WriteLine($"This is ParentClass,My name is {name}");
}
public void CommonMethod()
{
Console.WriteLine("ParentClass CommonMethod");
}
/// <summary>
/// 虚方法,包含方法实现,可以被子类重写
/// </summary>
public virtual void VirtualMethod()
{
Console.WriteLine("ParentClass VirtualMethod");
}
/// <summary>
/// 抽象方法,子类必须实现该方法
/// </summary>
public abstract void AbstractMethod();
}
/// <summary>
/// 子类
/// </summary>
public class ChildClass:ParentClass
{
/// <summary>
/// 子类实例化的时候,要先进行父类的实例化
/// </summary>
public ChildClass()
:base("Olive")//调用父类构造函数
{
Console.WriteLine("This is ChildClass");
}
public new void CommonMethod()
{
Console.WriteLine("ChildClass CommonMethod");
}
/// <summary>
/// 重写父类的虚方法
/// </summary>
public override void VirtualMethod()
{
Console.WriteLine("ChildClass VirtualMethod");
base.VirtualMethod();//调用父类方法
}
/// <summary>
/// 实现父类的抽象方法
/// </summary>
public sealed override void AbstractMethod()
{
Console.WriteLine("ChildClass AbstractMethod");
}
}
ParentClass parent = new ChildClass();
Console.WriteLine("parent.CommonMethod()");
parent.CommonMethod();
Console.WriteLine("parent.VirtualMethod()");
parent.VirtualMethod();
Console.WriteLine("parent.AbstractMethod()");
parent.AbstractMethod();
结果如下:

由以上结果可以发现,子类用new修饰的方法,
运行ParentClass p=new ChildClass();
p.CommonMethod();
会输出ParentClass CommonMethod
这是因为class ChildClass继承于class ParentClass,现在ChildClass中的CommonMethod函数隐藏ParentClass中的CommonMethod,所以从ChildClass (包括继承于ChildClass的子类)的角度来看类中的CommonMethod就是ChildClass. CommonMethod,ParentClass的CommonMethod不可见,但是如果从ParentClass的角度来看ChildClass,ParentClass只认识类ChildClass中继承于类ParentClass的CommonMethod函数,对于ChildClass类中的CommonMethod它不可见,所以ParentClass a=new ChildClass ();a. CommonMethod ();相当于是调用了类ChildClass中继承于ParentClass的CommonMethod函数
1.2.2 重载overload
重载只是针对一个类内部的几个参数不同,名称相同的方法。
/// <summary>
/// 重载(编译时多态)
/// </summary>
/// <param name="name"></param>
public void CommonMethod(string name)
{
Console.WriteLine($"ChildClass.CommonMethod的重载:Name is {name}");
}
public void CommonMethod(int age)
{
Console.WriteLine($"ChildClass.CommonMethod的重载:Age is {age}");
}
public void CommonMethod(string name,int age)
{
Console.WriteLine($"ChildClass.CommonMethod的重载:Name is {name}, Age is {age}");
}
public void CommonMethod(int age,string name)
{
Console.WriteLine($"ChildClass.CommonMethod的重载:Age is {age}, Name is {name}");
}
1.3 抽象类、接口理解和选择
1.3.1 抽象类
抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。
抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。另外,实现抽象方法由override方法来实现
抽象类就是父类+约束,父类是为了更好的代码重用,约束是为了多态变化。
/// <summary>
/// 父类,抽象类
/// </summary>
public abstract class ParentClass
{
public ParentClass(string name)
{
Console.WriteLine($"This is ParentClass,My name is {name}");
}
public void CommonMethod()
{
Console.WriteLine("ParentClass CommonMethod");
}
/// <summary>
/// 虚方法,包含方法实现,可以被子类重写
/// </summary>
public virtual void VirtualMethod()
{
Console.WriteLine("ParentClass VirtualMethod");
}
/// <summary>
/// 抽象方法,子类必须实现该方法
/// </summary>
public abstract void AbstractMethod();
}
1.3.2 接口
接口是包含一组方法的抽象类型,其中每一种方法都有其名称、参数和返回值。为了约束,告诉外部有哪些功能。
接口包含方法(不包含方法实现)、事件、属性、索引器,不包含字段、委托。
一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。
public interface ITestInterface
{
string Show(string name);
string Info { get; set; }
int this[int i] { get; }
event Action DoWorkHandler;
}
1.3.3 如何选择
接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系。
抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。如果只是为了约束,有哪些功能,则选择接口,如果包含代码的重用则选择抽象类。
.NET知识梳理——3.面向对象的更多相关文章
- [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- iOS多线程知识梳理
iOS多线程知识梳理 线程进程基础概念 进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 线程 1个进程要想执行任务,必须得有线程(每1个 ...
- iOS 多线程知识梳理
#iOS多线程知识梳理 ##线程进程基础概念 ###进程 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 ###线程 1个进程要想执行任务,必须 ...
- iOS开发知识梳理博文集
前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
随机推荐
- 春节过后就是金三银四求职季,分享几个Java面试妙招,轻松搞定HR!
春节过后就是金三银四,分享几个Java面试妙招,轻松搞定HR! 2020年了,先祝大家新年快乐! 今年IT职位依然相当热门,特别是Java开发岗位.软件开发人才在今年将有大量的就业机会.春节过后,金三 ...
- 【spring boot】SpringBoot初学(7)– 多数据源及其事务
前言 github: https://github.com/vergilyn/SpringBootDemo 代码位置: 参考: Spring Boot Reference Guide , §77.2 ...
- VMware、Linux(CentOS 7)安装,供参考。
前端开发,学习Linux,记录安装中的一些问题,比如在安装最小版后,如何由命令行转为图形界面等. -------------笔记中截图参考其他资料. 下载文件 VMware 12: 链接:https: ...
- [[FJOI2016]神秘数][主席树]
明白之后 5min 就写好了-自闭- 这题的题意是问你 \([L,R]\) 区间的数字不能构成的数字的最小值- 首先考虑 如果 \([1,x]\) 可以被表示 那么加入一个 \(a_i\) 显然 \( ...
- 常见sql注入的类型
这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解 目录 最基础的注入-union注入攻击 Boolean注入攻击-布尔盲注 报错注入攻击 时间注入攻击-时间盲注 堆叠查询注入攻击 二 ...
- PAT (Basic Level) Practice (中文)1021 个位数统计 (15 分)
给定一个 k 位整数 1 (0, ,, dk−1>0),请编写程序统计每种不同的个位数字出现的次数.例如:给定 0,则有 2 个 0,3 个 1,和 1 个 3. 输入格式: 每个输入包含 ...
- 调用window Api 进行对特定窗口的进程ID进行操作
/// <summary> /// 获取窗口句柄 /// </summary> /// <param name="lpClassName">&l ...
- 2018ICPC南京站Problem J. Prime Game
题意: 对于所有数字分解质因子,如果某个质因子在这个区间出现,则贡献为1,求所有质因子对所有区间做的贡献. 解析: 考虑如果所有全部区间都有这个质因子则这个质因子的贡献是n*(n+1)/2,对于任意因 ...
- SVM-支持向量机(三)SVM回归与原理
SVM回归 我们之前提到过,SVM算法功能非常强大:不仅支持线性与非线性的分类,也支持线性与非线性回归.它的主要思想是逆转目标:在分类问题中,是要在两个类别中拟合最大可能的街道(间隔),同时限制间隔侵 ...
- 在macOS 上添加 JAVA_HOME 环境变量
If you are planing to develop Java Apps on your Mac, you may have to set $JAVA_HOME environment vari ...