面向对象编程

  • 相关概念
    • 1. this关键字
    • 2. 重载构造函数
    • 3. 内存回收与析构函数
    • 4. 对象初始化器
    • 5. 数据抽象与封装
    • 6. readonly实例变量
  • 代码例程
    • 例子1:对象初始化器使用
    • 例子2:职工档案管理系统
    • 例子3:Time类
    • 例子4:点与直线

相关概念

1. this关键字

  • 类的非静态方法中存在一个关键字this,它用于引用访问该方法的当前实例。
  • 形参与实例成员同名须恢复this引用

2. 重载构造函数

  • 构造函数可以对类对象进行初始化,类的构造函数也可以重载。

3. 内存回收与析构函数

  • 为避免资源泄露,C#的公共语言运行环境(CLR)进行自动的内存管理,采用垃圾回收机制释放对象不再学要的内存空间。该机制通过调用析构函数来完成。
  • 在默认情况下,编译器自动生成空的析构函数。
  • 一个类中只能有一个析构函数;
  • 构造函数和析构函数不能继承或重载;
  • 析构函数没有参数和返回类型;
  • 构造函数和析构函数都是由系统自动调用的,发生早创建对象和销毁对象时;

4. 对象初始化器

  • 对象初始化器是利用属性为其对象的实例成员初始化。
  • 在创建对象的语句中,使用一堆大括号完成,其中每个初始化操作都是一个赋值操作,左边是一个属性名,右边则是具体要赋的值。
  • 使用对象初始化器特别适用于没有构造函数的情形。
    在类Time中添加3个属性,每个属性都包含get访问器和set访问器:

5. 数据抽象与封装

  • 类是对数据和方法的封装,封装把类的属性和方法看成了一个密不可分的整体,从而使类具有明确的独立性,这样能够完成整地描述并对应于一类具体的事物,封装是面向对象程序设计的基本特征之一。
  • 类的封装对于类的使用者隐藏了实现的细节,这种描述类的功能而不管其实现细节称为数据抽象。
  • 面向对象编程的主要活动就是生成自己的新的数据类型(即类)和表达这些数据之间的相互作用。

6. readonly实例变量

  • 类中使用const可以定义不能修改其值得实例变量(常量),该类的各个对象都使用。
  • 如果要在类中定义这样的变量,其值在构造函数中进行初始化,初始化后就不能修改 ,但不同的对象调用构造函数时可以将该变量初始化成不同的值,这样的变量可以用readonly关键字进行修饰。
  • 例如下面的语句:
private readonly in INCREMENT;

代码例程

例子1:对象初始化器使用

namespace Ch07Ex01
{class Program{static void Main(string[] args){Time2 t1 = new Time2 { Hour = 3, Minute = 5, Second = 6 };Console.WriteLine(t1);//调用默认ToString()方法}}public class Time2{private int hour;private int minute;private int second;public int Hour{get { return hour; }set { hour = (value >= 0 && value < 24) ? value : 0; }}public int Minute{get { return minute; }set { minute = (value >= 0 && value < 60) ? value : 0; }}public int Second{get { return second; }set { second = (value >= 0 && value < 60) ? value : 0; }}public override string ToString(){return string.Format("{0:D2}:{1:D2}:{2:D2}", hour, minute, second);}}
}

例子2:职工档案管理系统

  • 一个类中的成员也可以是其他类的对象,这个功能称为合成,合成也是软件复用的一种方式。
/* 职工档案管理系统* 定义工资类EmptySalary、日期类Date、职工类Employee。* 工资类包括基本工资、岗位津贴、房租、电费和水费。* 日期类包括年、月、日三种数据成员。* 职工类包括工作部门、姓名、出生日期、职务、参加工作时间和工资。其中的职务* 类型为枚举型,有经理、工程师、职员和工人四种类型。*/
namespace Ch07Ex03
{class Program{static void Main(string[] args){//第一名职工的数据Date birthdate = new Date(1980, 5, 3);Date workdate = new Date(1999, 7, 20);Employee Emp1 = new Employee("销售处", "张工", birthdate, Position.ENGINEER, workdate);Emp1.SetSalary(3000, 2000, 1000, 50, 20);Emp1.ShowMessage();//第二名职工的数据birthdate.init(1979, 4, 8);workdate.init(2002, 3, 1);Employee Emp2 = new Employee("项目部", "李工", birthdate, Position.MANAGER, workdate);Emp2.SetSalary(2000, 2900, 1500, 50, 20);Emp2.ShowMessage();}}class EmpSalary{public float Wage;          //基本工资public float Subsidy;       //岗位津贴public float Rent;          //房租public float CostOfElec;    //电费public float CostOfWater;   //水费public float RealSum{get { return Wage + Subsidy - Rent - CostOfElec - CostOfWater; }}}public enum Position //枚举类型,定义不同职务{MANAGER,    //经理ENGINEER,   //工程师EMPLYEE,    //职员WORKER      //工人}class Date{int day, month, year;public Date(int yy, int mm, int dd)//构造函数{init(yy, mm, dd);}public Date(Date x)//重载构造函数{init(x.year, x.month, x.day);}public void init(int yy,int mm,int dd){year = (yy >= 1900 && yy <= 2100) ? yy : 1900;month = (mm >= 1 && mm <= 12) ? mm : 1;day = (dd > 1 && dd <= 31) ? dd : 1;}public void Printymd()//安年月日输出日期{Console.WriteLine("{0}-{1}-{2}", year, month, day);}}class Employee//定义职工类{string Department;          //工作部门string Name;                //名字Date Birthdate;             //出生日期Position EmpPosition;       //职务Date DateOfWork;            //参加工作时间EmpSalary Salary = new EmpSalary();           //工资public Employee(string Depart,string Name,Date tBirthdate,Position nPosition,Date tDateOfWork){this.Department = Depart;this.Name = Name;this.Birthdate = tBirthdate;this.EmpPosition = nPosition;this.DateOfWork = tDateOfWork;}public void SetSalary(float wage,float subsidy,float rent,float elec,float water)//工资项初值设置方法{Salary.Wage = wage;Salary.Subsidy = subsidy;Salary.Rent = rent;Salary.CostOfElec = elec;Salary.CostOfWater = water;}public float GetSalary{get { return Salary.RealSum; }} public void ShowMessage(){Console.WriteLine("部门:{0}", Department);Console.WriteLine("姓名:{0}", Name);Console.WriteLine("出生日期:");Birthdate.Printymd();Console.WriteLine("职务:");switch(EmpPosition){case Position.MANAGER:Console.WriteLine("经理");break;case Position.ENGINEER: Console.WriteLine("工程师"); break;case Position.EMPLYEE: Console.WriteLine("职员"); break;case Position.WORKER: Console.WriteLine("工人"); break;}Console.Write("工作日期:");DateOfWork.Printymd();Console.WriteLine("工资:{0}", GetSalary);Console.WriteLine("------------------------------------");} }
}

例子3:Time类

namespace Ch07Ex02
{class Program{static void Main(string[] args){Time t1 = new Time();t1.Show();Time t2 = new Time(2, 34, 34);t2.Show();     }}public class Time{private int hour;private int minute;private int second;public void Show(){Console.WriteLine("{0:D2}:{1:D2}:{2:D2}", hour, minute, second);}public Time(){hour = minute = second = 0;Console.WriteLine("Default");}public Time(int h,int m,int s){hour = h >= 0 && h <= 24 ? h : 0;minute = m >= 0 && m <= 59 ? m : 0;second = s >= 0 && s <= 59 ? s : 0;Console.WriteLine("struct2");}~Time(){Console.WriteLine("Destroy");}}
}

例子4:点与直线

//创建点和直线的类
namespace Ch07Ex01
{class Program{static void Main(string[] args){Line line1 = new Line();Console.WriteLine("Distance line1:{0}", line1.Distance());Line line2 = new Line(1, 1, 4, 5);Console.WriteLine("Distance line2:{0}", line2.Distance());Point p1 = new Point(1, 1);Point p2 = new Point(4, 5);Line line3 = new Line(p1, p2);Console.WriteLine("Distance line3:{0}", line3.Distance());}}class Point{public double X { get; set; }public double Y { get; set; }public Point(){X = Y = 0;}public Point(double x,double y){X = x;Y = y;}}class Line{private Point p1;private Point p2;public Line(){p1 = new Point();p2 = new Point();}public Line(double x1,double y1,double x2,double y2){p1 = new Point(x1, y1);p2 = new Point(x2, y2);}public Line(Point p1,Point p2){this.p1 = p1;this.p2 = p2;}public double Distance(){return Math.Sqrt((p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y));}}
}

C# 类与对象(面向对象的编程)相关推荐

  1. 饥荒时用java写的吗_【图片】类与对象面向对象编程【饥荒mod制作吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 ----------深入饥荒的类 上一节讲完了基本概念,如果还心存疑虑可以百度搜索"类与对象"以获取更多信息 本节将深入研究饥荒代码中 ...

  2. 第1章 类和对象—面向对象概念

    面向对象程序设计(Object-Oriented Programming,OOP)是一种程序设计架构,同时也是一种程序开发的方法.对象指的是类的实例,它将对象作为程序的基本单元,将程序和数据封装其中, ...

  3. 第3个项目实操:用类与对象的方法编程

    1. 明确项目目标 本关我们将在游戏中定义三种类型的角色:圣光骑士.暗影刺客.精灵弩手,他们三者之间也会互相克制. 2. 分析过程,拆解项目 3. 逐步执行,代码实现 上个版本代码: import t ...

  4. 17、Java中的面向对象的编程思想

    Java中的面向对象的编程思想 作者:韩茹 公司:程序咖(北京)科技有限公司 程序咖:IT职业技能评测平台 网址:https://www.chengxuka.com 任务 1. 面向对象 2. 面向过 ...

  5. ES6学习笔记(一):轻松搞懂面向对象编程、类和对象

    文章目录 面向过程编程P OP(Process oriented programming) 面向对象编程OOP(Object Oriented Programming) ES6中的类和对象 面向对象 ...

  6. 初学者python笔记(面向对象编程、类与对象)

    文章目录 面向对象设计 类与对象的概念 1.类与对象的本质 2.面向对象设计 到 面向对象编程 3.类实例化 4.例如一个学校类 面向对象编程 1.案例 2.面向对象语言和面向对象编程之间的关系 3. ...

  7. python【面向对象(类和对象)】

    1.面向对象(类和对象) 1.编程思维 根据面对问题不同人呈现出来的思维模式不同,可以将编程思维分为三种: 1.面向过程编程(穷人思想)-- 会基本的逻辑和语法(遇到问题马上想到的是解决问题的具体逻辑 ...

  8. [C# 类和对象]-C# 中的方法以及类和对象编程

    ################################################## 目录 C# 的方法 C# 定义方法 访问修饰符 返回值类型 方法名 参数列表 方法主体 方法名的命 ...

  9. Python的零基础超详细讲解(第十三天)-Python的类与对象

    基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...

  10. 一文讲全了Python 类和对象内容

    摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan  . Pytho ...

最新文章

  1. 树莓派(raspberry)启用root账户
  2. python简单代码input-python简单基础代码
  3. 原创:E325: ATTENTION vim超完整超给力的问题与解决方法
  4. 安装archlinux
  5. linux向上翻页_linux学习基础篇——文件管理(一)
  6. java经典设计模式4,JAVA设计模式(4) 之装饰设计模式
  7. 清华学生计划表,大写的服!
  8. c 语言 移位四舍五入,关于C 语言中的四舍五入问题
  9. ubuntu15.10 gvim php,IDE---Gvim之ubuntu下配置php的ide开发工具
  10. $_FILES[file]['error']
  11. SparkRDD内核
  12. bzoj 3672 利用点分治将CDQ分治推广到树型结构上
  13. python网页设计基础教程_Pillow-优秀的Python图像处理库安装及入门教程
  14. origin汉字问题与特殊符号
  15. K8s 亲和性和非亲和性(Affinity)
  16. Rk3399—添加usb转串口驱动
  17. Paper reading (九十一):Bifidobacterium breve Bif195 Protects Against Small-Intestinal Damage
  18. mysql内存参数及最大内存
  19. av_dump_format
  20. java1.7 apk 签名_【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用...

热门文章

  1. CentOS 8下 MySQL 8.0 安装部署(亲测)
  2. Ubuntu下OpenResty搭建高性能服务端
  3. 实战 | F1060路由模式典型组网配置案例(RIP)
  4. Kibana插件sentinl使用教程
  5. linux系统安全检查
  6. 使用JDK中的 keytool【创建证书】・【查看】・【使用】
  7. 使用windows的事件查看器(eventvwr),查看、电脑执行过的你不知道的操作・开机・关机时间
  8. win10 中 如何 按日期 对文件 进行检索(找到目录下,指定日期修改的文件)
  9. Kali linux2.0里Metasploit的postgresql selected, no connection问题解决
  10. [PVE]解决 ProXmoX VE升级 apt-get update 报错的问题