面向对象程序设计教程

本文是面向对象程序设计(C#版)的学习笔记,介绍了对象与类的概念,以及对象的泛化、类的实例化。讲解了C#中的字段、属性、方法和访问修饰符,通过代码示例展示了类的创建和使用。强调了封装的重要性,探讨了属性作为字段的封装形式,并简要提到了构造函数、继承、多态等面向对象编程的关键概念。
摘要由CSDN通过智能技术生成

面向对象程序设计教程(c#版)(本文只是本人在学习有关教程时所作的一个笔记,仅供参考)

前言

本文只用于学习交流使用,如其中有用词不当或代码错误的地方,还望指正。本文使用教材及参考资料包括但不限于面向对象程序设计教程(c#版)刘瑞新等编著。

面向对象程序设计是一种程序设计架构,同时也是程序开发的一种方法,学习本课程之前希望大家能够有一定的编程语言基础,本文中所有程序编译环境均为Visual Studio 2022。

类与对象

1、对象是什么?类是什么?

对象可不是买象棋就能有的,也不是轻易就能懂得!!!当然,这是现实中的那种对象。

而在这们课程中呢,我们把所有想要研究的事物都叫做对象,包括具体的事物或者抽象的规则或事件。这样说似乎有点太过于抽象了,不妨来点具体的,我是一个的人,我的电脑是一台笔记本电脑,张宇老师的面向对象课程是一门课程,我的笔记是一本笔记,辽宁工程技术大学校规是一个规则,我们在研究某个对象时是不可能研究泛化的事物,例如人,电脑,课程,笔记,规则,必须要指明研究对象的实例,例如我,我的电脑,张宇老师的面向对象课程,我的笔记,辽宁工程技术大学的校规。

当然,有些同学可能会这样想,我也可以去研究人类,研究电脑,但是研究人类是否需要研究某部分具有代表性的人类的实体才能得出想要的数据,研究电脑是不是也需要去研究某台电脑才能得出想要的数据,如果你要研究电脑系统,那你研究的对象就是电脑系统,而非电脑。

类是什么?

所谓的类就是对象的泛化合集,比如上文提到的人类是我的泛化合集,笔记本电脑是我的电脑的泛化合集,课程是张宇老师面向对象课程的泛化合集,笔记是我的笔记的泛化合集,规则是辽宁工程技术大学校规的泛化合集。

对象的泛化

所谓对象的泛化就是把对象抽象为类的一个过程,而在把对象抽象为类的过程中我们不可避免的要分析对象的特征,特征包括静态特征(状态)和动态特征(操作),相信看文字大家都能看懂,但我还是要啰嗦一下:所谓静态特征就是那些表示当前状态的特征,例如我的姓名=’xx‘、年龄=’18’(假装年轻)、性别=‘男’、籍贯=“黔”;张宇老师面向对象课程的学分=“4”、学时=“48”、课程名称=“面向对象程序设计”,辽宁工程技术大学校规的可实行范围=“本校所有师生”、修订时间=“2018.9.1”(编的哈)、校规数量=‘30’等等;而所谓动态特征就是表示当前对象能够完成的那些行为特征,例如我能吃、喝、睡、玩(有点像猪哈);张宇老师的面向对象课程能听课、上机、考试;;辽宁工程技术大学校规能惩罚、奖励等等。

而我们通过对对象的特征分析,能够泛化出一个个类,例如一个人应该有姓名,年龄,性别,籍贯等字段以及吃、喝、睡、玩等方法;一个课程应该有课程名称、学分、学时等字段以及听课、上机、考试等方法;一个规则应该要有可实行范围、修订时间、规则数量等字段以及惩罚、奖励等方法

(上方红色字体需要特别注意,我将在下方特别说明)

总结就一句话,对象的泛化就是类

类的实例化

类的实例化应该都能猜到了,类的实例化就是类实例化成一个对象,例如我们把上面泛化出来的人的字段赋予具体的值便实例化出了一个对象,我就是人实例化的一个对象,张宇老师的面向对象课程就是课程的一个实例化对象,辽宁工程技术大学校规就是规则的一个实例化对象。

总结也是一句话,对象是类的实例化。

字段,方法,属性

在c#语言中,一个类里一般由字段,方法,属性构成,所谓字段,就是类里面那些静态特征,而属性是字段的一种从属性,可以将字段封装为只读或只写,所谓方法就是类的行为特征。可能讲的有些模糊,下面代码示例我会标准详细备注。

本小节代码示例:

我在下面声明了两个类,一个是课程,一个是学生,并且实例化了一个学生小红以及一门课程数学:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;//前面是导入某些包或库

namespace ConsoleApp3//项目命名空间,新建项目时会有,也可以用杂项文件编写此代码,不加命名空间
{
    class Student//定义一个学生类
    {
        private string name;//定义一个私有字段,只能在类内访问
        public int age;//定义为公共字段,可以在其他程序集访问
        public Student(int age,string name)//构造函数,每个类都会有,可以不写,他会有一个默认的构造函数,后面会有解释,每个对象实例化的时候都需要传入两个参数
        {
            this.age = age;
            this.name = name;
        }
        public string Name { get => name; set => name = value; }//这个就是封装的概念,这里希望大家记住这是name字段的属性
        public void eat(string food_name)//定义了一个吃的方法
        {
            Console.WriteLine(food_name + "真好吃");
        }
        public void learn(Course course)//定义了一个学习方法
        {
            Console.WriteLine(this.name+"选修了"+course.Course_name +"课程");
        }
    }
    class Course//基本和上面的类一致
    {
        private string course_name;
        private int credit_hour;
        public Course(string name,int grade)
        {
            course_name = name;
            credit_hour = grade;
        }

        public string Course_name { get => course_name; set => course_name = value; }

        public void exam(Student str)
        {
            Console.WriteLine(str.Name + "正在考试");
        }
    }
    class progame
    {
        static void Main(string[] args)//这是Main方法,一个程序的入口
        {
            Student small_red = new(17, "小红");//实例化了一个名为小红,年龄17的对象
            Course math = new("数学分析", 5);//实例化了一门名为数学分析,学分为5的课程
            small_red.eat("白米饭");//小红吃白米饭
            small_red.learn(math);//小红学习数学分析
            math.exam(small_red);//数学分析有学生在考试
        }
    } 
}

通过上面这段代码,我希望大家能有一下几个认知

1、对象是面向对象程序的基本单元,但也请记住,面向对象程序设计只是一种设计思想。
2、面向对象程序设计是由类和对象组成的,每一个程序的入口的是某个类下的Main方法,有且只能由一个Main方法
3、类里面包括字段,属性和方法
4、字段可以是我们基本数据类型(int double char string),也可以是我们定义以及系统定义的类。
5、字段的声明格式为:保护级别 数据类型 字段名;保护级别会在继承有详细介绍,数据类型和其他语言一样,字段名也就是所谓的变量名
6、属性是针对字段而言(封住会有介绍)
7、方法的前身实际上就是函数,所以其使用声明格式为:保护级别 返回值类型 方法名(传入参数的类型 传入参数的名字){}***"传入参数可以有多个"***
多费点口舌,解释一下命名空间

我们在程序开发中很难由一个人独立完成一整个系统或程序的开发,基本上都会由一个团队或多个团队合作开发,但是总会出现张三声明了一个名为act的类,李四也声明了一个act的类,这个时候如果把张三和李四的代码合并到一起就会出现程序出现bug,他不知道在什么情况下要使用张三的act,什么情况下要使用李四的act,所以提出了一个命名空间的概念,我们只需要在声明张三的act前面加上一个张三:(编程时别使用中文哈),这样程序遇到这个张三:act就知道需要调用张三写的那个类了。

封装

接下来开始学习封装这个概念。

什么是封装?

顾名思义,所谓封装就是把东西密封包装起来,在面向对象程序设计里,就是指把类密封包装。将类内的字段属性方法进行一定意义上的封装,使得外部无法轻易修改类内部的参数。更方便整个程序的搭建

为什么要使用封装?

简单地说,封装的目的是为了增强安全性以及简化编程。某些类的某些字段或者方法是我们不希望被其他类或其他程序集访问,因为一旦访问就会出现其字段值被修改,这样不利于我们的程序开发,就好比一个人的银行账户密码,默认是不希望被其他对象知道的,如果被知道了很容易发生一些经济损失;同时,封装的另外一个好处在于在其他类调用的过程中不需要知道类内的具体实现方法,只需要会使用即可。就如我们使用手机并不需要知道手机的实现细节,只需要知道手机如何使用即可。

如何封装?

这个时候我们必须考虑到四个关键字

  • private(私有的)
  • protected(受保护的)
  • internal(内部的)
  • public(公开的)

我一一解释一下上面四个关键字

class family{
	private string secret;//每个人都有不希望被别人知道的密码,所有我们要将其私有化,不会被任何人知道
    protected int bank_id;//如果遇到这种银行卡id,我们不希望被别人知道,但是却又希望自己的子类知道,不然带着钱入土?这个时候我们就可以用protected关键字来声明,这样保护级别虽然降低了,但是只会由我们的子类知道
    internal string name;//为了方便交流,我们不得不希望那些一起工作的同事或者一起学习的同学知道我们的名字,所以可以用internal关键字来声明,这样既不会被陌生人(其他程序集)知道,也能够被熟人(同一程序集)知道
    public string say(){}//无论是陌生人还是熟人,至少在与我们交流时我们都能回答问题,所以公开了一个say方法,目的便是为了能够让所有对象及类能够访问。
}

特别提示:类也是一种数据类型,所以也可以用这四个关键字声明;

需要关注的重点:大多数情况下所谓的封装是指封装字段。

属性的声明

接下来我们来解释一下什么是属性?

我们知道,每个人都会有秘密,但在上面的实验中,我们将密码设为了私有的,那如果对象某一天想相某人倾述这个秘密该怎么办?写一个secret_Talk()方法?那如果想要修改或者增加密码又该怎么办?再写一个insert_Secret()方法么?这样做的缺点是需要增加许多方法,所以C#提出了属性的定义

class family{
	private string secret;//将字段私有化
	public Secrent{//属性的声明,声明为字段的开头字母大写
	get{return secret;}//提供佛那个一个get方法,返回secret,读出值到某个变量去
	set{this.secret = value;}//提供一个set方法,写入值到secret中
	}
}
class progame{
    static void Main(string[] args){
        family p = new();
        p.Secrent = '我爱自己';//设定属性值
        string t = p.Secrent; //将属性值返回到t中
    }
}

在这里必须强调一下,方法和属性是有区别的,方法必须要有返回值类型以及参数列表,但是属性不能有

方法保护级别 返回值类型 方法名(参数列表){方法体}
//返回值类型可以为void,但是必须写,参数列表可为空,但是必须要有'()'

private 字段类型 字段名;
public 字段名首字母大写(属性名){
get{return 字段值;}//事实上也可以直接用我第一个样例代码中的那个结构
set{字段值 = value;}
}
//必须要有几个认识,属性必然依赖字段存在,至少我现在是这样理解的
//2、属性不需要返回值类型,但是属性名命名时一般默认为字段名首字母大写,字段名尽量全小写
//3、属性的保护级别为公开,字段保护级别为私有(具体换为其他的是否可以我并没有试验过)
//4、属性至少有get和set访问器至少一个,否则你可以直接不用写,但是每个访问器至多只能有一个,也就是不能有两个get或者两个set
//5、由于属性是特殊的方法,所以不能使用set初始化一个类或结构体的属性
//6、不能声明const或readonly的属性
构造函数

持续更新中。。。

继承

多态

接口

引用类型与值类型

数据结构之栈

数据结构之队列

数据结构之链表

设计模式之单例模式

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值