C# 类与对象(面向对象的编程)
面向对象编程
- 相关概念
- 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# 类与对象(面向对象的编程)相关推荐
- 饥荒时用java写的吗_【图片】类与对象面向对象编程【饥荒mod制作吧】_百度贴吧...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 ----------深入饥荒的类 上一节讲完了基本概念,如果还心存疑虑可以百度搜索"类与对象"以获取更多信息 本节将深入研究饥荒代码中 ...
- 第1章 类和对象—面向对象概念
面向对象程序设计(Object-Oriented Programming,OOP)是一种程序设计架构,同时也是一种程序开发的方法.对象指的是类的实例,它将对象作为程序的基本单元,将程序和数据封装其中, ...
- 第3个项目实操:用类与对象的方法编程
1. 明确项目目标 本关我们将在游戏中定义三种类型的角色:圣光骑士.暗影刺客.精灵弩手,他们三者之间也会互相克制. 2. 分析过程,拆解项目 3. 逐步执行,代码实现 上个版本代码: import t ...
- 17、Java中的面向对象的编程思想
Java中的面向对象的编程思想 作者:韩茹 公司:程序咖(北京)科技有限公司 程序咖:IT职业技能评测平台 网址:https://www.chengxuka.com 任务 1. 面向对象 2. 面向过 ...
- ES6学习笔记(一):轻松搞懂面向对象编程、类和对象
文章目录 面向过程编程P OP(Process oriented programming) 面向对象编程OOP(Object Oriented Programming) ES6中的类和对象 面向对象 ...
- 初学者python笔记(面向对象编程、类与对象)
文章目录 面向对象设计 类与对象的概念 1.类与对象的本质 2.面向对象设计 到 面向对象编程 3.类实例化 4.例如一个学校类 面向对象编程 1.案例 2.面向对象语言和面向对象编程之间的关系 3. ...
- python【面向对象(类和对象)】
1.面向对象(类和对象) 1.编程思维 根据面对问题不同人呈现出来的思维模式不同,可以将编程思维分为三种: 1.面向过程编程(穷人思想)-- 会基本的逻辑和语法(遇到问题马上想到的是解决问题的具体逻辑 ...
- [C# 类和对象]-C# 中的方法以及类和对象编程
################################################## 目录 C# 的方法 C# 定义方法 访问修饰符 返回值类型 方法名 参数列表 方法主体 方法名的命 ...
- Python的零基础超详细讲解(第十三天)-Python的类与对象
基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...
- 一文讲全了Python 类和对象内容
摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan . Pytho ...
最新文章
- 树莓派(raspberry)启用root账户
- python简单代码input-python简单基础代码
- 原创:E325: ATTENTION vim超完整超给力的问题与解决方法
- 安装archlinux
- linux向上翻页_linux学习基础篇——文件管理(一)
- java经典设计模式4,JAVA设计模式(4) 之装饰设计模式
- 清华学生计划表,大写的服!
- c 语言 移位四舍五入,关于C 语言中的四舍五入问题
- ubuntu15.10 gvim php,IDE---Gvim之ubuntu下配置php的ide开发工具
- $_FILES[file]['error']
- SparkRDD内核
- bzoj 3672 利用点分治将CDQ分治推广到树型结构上
- python网页设计基础教程_Pillow-优秀的Python图像处理库安装及入门教程
- origin汉字问题与特殊符号
- K8s 亲和性和非亲和性(Affinity)
- Rk3399—添加usb转串口驱动
- Paper reading (九十一):Bifidobacterium breve Bif195 Protects Against Small-Intestinal Damage
- mysql内存参数及最大内存
- av_dump_format
- java1.7 apk 签名_【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 
进行APK文件的签名,以及keystore文件的使用...
热门文章
- CentOS 8下 MySQL 8.0 安装部署(亲测)
- Ubuntu下OpenResty搭建高性能服务端
- 实战 | F1060路由模式典型组网配置案例(RIP)
- Kibana插件sentinl使用教程
- linux系统安全检查
- 使用JDK中的 keytool【创建证书】・【查看】・【使用】
- 使用windows的事件查看器(eventvwr),查看、电脑执行过的你不知道的操作・开机・关机时间
- win10 中 如何 按日期 对文件 进行检索(找到目录下,指定日期修改的文件)
- Kali linux2.0里Metasploit的postgresql selected, no connection问题解决
- [PVE]解决 ProXmoX VE升级 apt-get update 报错的问题