面向对象有封装、继承、多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务。这种编程方法提供了非常强大的多样性,大大增加了代码的重用机会,增加了程序开发的速度,将具备独立性特制的程序代码包装起来,修改部分程序代码时不至于会影响到程序的其他部分。

1.封装

每个对象都包含它进行操作所需要的所有信息,封装只公开代码单元的对外接口,而隐藏其具体实现,尽量不对外公开代码。使用封装有很多好处,从设计角度来讲,封装可以对外屏蔽一些重要的信息,比如使用电脑的人只要知道怎么使用电脑就可以,不用知道这些功能具体是怎么实现的;从安全性考虑,封装使对代码的修改更加安全和容易,封装明确的指出了哪些属性和方法是外部可以访问的,这样当需要调整这个类的代码时,只要保证公有属性不变,公有方法的参数和返回值类型不变,那么就可以尽情的修改这个类,而不会影响到程序的其他部分;封装还避免了命名冲突的问题,封装有隔离作用,不同的类中可以有相同名称的方法和属性,但不会混淆,也可以减少耦合。

2.继承

继承可以使用现有类的所有功能,并在无须重新编写原来的类的情况下,对这些功能进行扩展。使用继承而产生的类被称为派生类或子类,而被继承的类则称为基类或超类或父类。继承表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数,其子类是对父类的扩展;接口继承是表示一个类型只继承了函数的签名,没有继承任何实现代码。继承划分了类的层次性,也可以说继承是对类的分组,父类代表的是抽象的类,更常用的类,而子类代表的是更为具体,更为细化的类;继承是实现代码重用、扩展的重要手段。所谓抽象的类是指与具体的事项相联系,但只是表达整体而不是具体概念的类,比如说形状包含正方形、长方形、圆等,这时候形状是一个抽象的概念,相当于一个父类,而正方形、长方形、圆是具体的形状,相当于是子类。

3.多态

多态是指程序中同名的不同方法共存的情况,主要通过子类对父类方法的覆盖来实现多态。这样,不同类的对象可以用同名的方法完成特定的功能,但具体的实现方法却可以不同。比如说形状包含正方形、长方形、圆等,每个形状都有面积和周长,但是不同的形状计算面积和周长的方法都不同。

下面就举个例子来说明封装、继承、多态:

这个例子的基类,就是上面描述概念的时候提到的形状,形状是基类,而这个基类是个抽象的概念,而不是具体的,因此是抽象类,此类包含属性形状名称、输出形状周长和面积的方法以及计算形状周长和面积的抽象方法:

/// <summary>
/// 形状基类
/// </summary>
public abstract class Shape
{
/// <summary>
/// 形状名称
/// </summary>
public string ShapeName { get; private set; } public Shape(string shapeName)
{
ShapeName = shapeName;
} /// <summary>
/// 输出形状周长
/// </summary>
public virtual void PrintPerimeter(double perimeter)
{
Console.WriteLine(ShapeName + " Perimeter: " + perimeter);
} /// <summary>
/// 输出形状面积
/// </summary>
public virtual void PrintArea(double area)
{
Console.WriteLine(ShapeName + " Area: " + area);
} /// <summary>
/// 计算形状周长
/// </summary>
/// <returns></returns>
public abstract double CalculatePerimeter(); /// <summary>
/// 计算形状面积
/// </summary>
/// <returns></returns>
public abstract double CalculateArea();
}

下面再来看具体的子类,子类是圆,包含属性半径、计算周长和面积的方法:

/// <summary>
/// 圆
/// </summary>
public class Circle : Shape
{
/// <summary>
/// 圆的半径
/// </summary>
public double R { get; set; } public Circle()
: base("Circle")
{
this.R = ;
} /// <summary>
/// 圆的周长
/// </summary>
/// <returns></returns>
public override double CalculatePerimeter()
{
return * Math.PI * R;
} /// <summary>
/// 圆的面积
/// </summary>
/// <returns></returns>
public override double CalculateArea()
{
return Math.PI * R * R;
}
}

再来看看长方形,包含属性高度和宽度、计算周长和面积的方法:

public class Rectangle : Shape
{
/// <summary>
/// 长方形的长度
/// </summary>
public double Width { get; set; } /// <summary>
/// 长方形的高度
/// </summary>
public double Height { get; set; } public Rectangle()
: base("Rectangle")
{
Width = ;
Height = ;
} /// <summary>
/// 长方形的周长
/// </summary>
/// <returns></returns>
public override double CalculatePerimeter()
{
return (Width + Height) * ;
} /// <summary>
/// 长方形的面积
/// </summary>
/// <returns></returns>
public override double CalculateArea()
{
return Width * Height;
}
}

以下是调用的代码:

Circle circle = new Circle();
circle.R = ; Square square = new Square();
square.Edge = ; Rectangle rectangle = new Rectangle();
rectangle.Width = ;
rectangle.Height = ; // 把子类赋给父类,能更好的体现多态性
IList<Shape> shapeList = new List<Shape>();
shapeList.Add(circle);
shapeList.Add(square);
shapeList.Add(rectangle); foreach (var shape in shapeList)
{
shape.PrintPerimeter(shape.CalculatePerimeter());
shape.PrintArea(shape.CalculateArea());
}

在此例子中,输出形状的周长和面积的方法没有太大作用,是因为方法的具体实现比较简单,如果是复杂的方法时会有很大作用。比如说想要实现拖拽功能,每个形状都是可以拖拽的,而且每个形状拖拽的方法都会是一样的,但是想要实现拖拽功能可不像输出这么简单,这时候子类可以继承父类的方法,直接调用。

C# 面向对象三大特性:封装、继承、多态的更多相关文章

  1. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  2. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  3. C++三大特性 封装 继承 多态

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

  4. [.net 面向对象编程基础] (11) 面向对象三大特性——封装

    [.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...

  5. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  6. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  7. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  8. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

  9. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  10. java面向对象三大特性之继承

    通过重用已经测试并验证通过的代码,怎样才减少开发工作,所有开发团队都在为一问题而努力.一个久经考验的方法是通过有效地使用Java继承优化应用程序开发. 继承的从某种意义上讲,继承的短暂美就如同宇宙中所 ...

随机推荐

  1. MII、GMII、RMII、SGMII、XGMII

    MII即媒体独立接口,也叫介质无关接口.它是IEEE-802.3定义的以太网行业标准.它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1). 数据接口包括分别用于发送器和接收器的两条独立信 ...

  2. [ci] 基于1 上文实现拉取代码后能自动触发sonar-runner实现代码扫描评测,job1完成

    基于1 上文实现拉取代码后能自动触发sonar-runner实现代码扫描评测,job1完成   添加sonar插件 SonarQube Plugin   配置: 系统设置à告知jenkins,sona ...

  3. 转载-android studio 各种问题

    android studio 各种问题 1.dexDebug ExecException finished with non-zero exit value 2 全bug日志如下: (Error:Ex ...

  4. tomcat各目录下的作用

    1.tomcat的主目录下的文件   bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令). 重要: 很多环 ...

  5. D. Powerful array 离线+莫队算法 给定n个数,m次查询;每次查询[l,r]的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt*cnt*x; 所有贡献和即为该区间的值;

    D. Powerful array time limit per test seconds memory limit per test megabytes input standard input o ...

  6. bat脚本批处理打war打包

    @echo =========================================== @echo 描述:打包脚本 @echo 作者:霍建国 @echo 日期:2018-03-13 @ec ...

  7. Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成

    Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下: Web 模块提供面向web的基本功能和面向web的应用上下文,比如多部分(multipa ...

  8. poj 1144(求割点个数)

    题目链接:http://poj.org/problem?id=1144 思路:判断一个点是否是割点的两个条件:1.如果一个点v是根结点并且它的子女个数大于等于2,则v是割点.2.如果点v不是根结点,并 ...

  9. windows 32位以及64位的inline hook

    Tips : 这篇文章的主题是x86及x64 windows系统下的inline hook实现部分. 32位inline hook 对于系统API的hook,windows 系统为了达成hotpatc ...

  10. OpenCV学习笔记十三:opencv_videostab模块

    一,简介: 该库用于视频稳像.