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.面向对象的更多相关文章

  1. [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

  2. iOS多线程知识梳理

    iOS多线程知识梳理 线程进程基础概念 进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 线程 1个进程要想执行任务,必须得有线程(每1个 ...

  3. iOS 多线程知识梳理

    #iOS多线程知识梳理 ##线程进程基础概念 ###进程 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 ###线程 1个进程要想执行任务,必须 ...

  4. iOS开发知识梳理博文集

    前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...

  5. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  6. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  7. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  8. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

  9. [SQL] SQL 基础知识梳理(五) - 复杂查询

    SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. [USACO19FEB]Painting the Barn G

    题意 \(n\)个矩阵\((0\le x_1,y_1,x_2,y_2\le 200)\),可交,可以再放最多两个矩阵(这两个矩阵彼此不交),使得恰好被覆盖\(k\)次的位置最大.\(n,k\le 10 ...

  2. AI 数学基础 张量 范数

    1.张量 几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量. 例如,可以将任意一张彩色图片表示成一个三阶张量,三个维度分 ...

  3. 方法重载(method overloading)

    为什么需要方法重载? 在编程语言中,名字的使用很重要.创建对象的时候,我们给一块内存区域起一个名字,然后这个名字就是我们创建的对象的引用,只要我们"叫"这个名字,计算机就知道我们在 ...

  4. SpringBoot初学(4)– JdbcTemplate和Mybatis

    前言 github: https://github.com/vergilyn/SpringBootDemo 代码位置: 一.Spring Boot集成JdbcTemplate或NamedParamet ...

  5. 【database】oracle关联查询主表对应的特定一行从表结果集

    主表: 从表: 结果集: 查询从表中年龄最大的一行数据,如果存在年龄相等的则为了保证唯一取id(主键)最大的一行. 一.利用sql子查询嵌套 -- -------------------------- ...

  6. css揭秘 一

    当某些值相互依赖是,应该把它们的相互关系用代码表达出来 font-size: 20px; line-height: 1.5; // 行高是字体的1.5倍 当改变某个参数时候,做到只改尽量少的地方,最好 ...

  7. cf1000E

    先缩点构造出一颗树,然后求树的直径就好 const int maxn=3e5+5; const int maxm=6e5+5; const int inf=1e9; int head[maxn],ve ...

  8. Agri-Net POJ - 1258 prim

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; ; #defi ...

  9. 04、extern引用全局变量

    这里强调一点就是关extern的声明: extern在声明中最主要的作用就是告诉编译器别的文件引用了全局变量XXXX. 举例: 有一个工程名字叫 Project1. Project1下面有两个.cpp ...

  10. WPF 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改

    该问题出现在WPF中的VM类中,ObservableCollection类型,该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改, ...