AI教我学编程之C#类的基本概念(2)

前言

AI教我学编程之C#类的基本概念(2) 已经更新,欢迎道友们前往阅读,本节我们继续学习C#类的基本概念

目录

  • 上节回顾
    • 质疑
    • 对话AI
      • 特殊情况
      • 发问
      • 解释
  • 数据/函数成员
  • 类和程序–实现一个简单的程序
    • 实现尝试
  • 声明类
  • 类的成员
    • 字段
    • 方法
  • 总结

上节回顾

AI认为

1、一个类的目的是封装数据和行为,通过创建对象的实例使用这些数据和行为
2、类的组成元素有以下五个

  • 成员变量:用于存储对象的状态或属性。
  • 成员方法:用于定义对象的行为或操作。
  • 构造函数: 用于初始化对象的特定状态。
  • 属性(可选): 提供对成员变量的访问和修改的公共接口。
  • 事件(可选): 允许对象发布和订阅事件。

质疑

AI的回答其实并不完整,不知道大家还记不记得,在AI教我学编程之C#类型 这篇文章中,我们提到:类型声明包含数据成员函数成员,而类既然属于类型的一种,那么类是否也是由数据成员和函数成员组成的呢?由此,我们展开今天的学习

对话AI

程序员

类是否是由数据成员和函数成员组成的?
是,返回一个表格,表头:数据成员 | 函数成员
作用:数据成员的作用 | 函数成员的作用
内容:数据成员包含的元素 | 函数成员包含的元素
否,说出你的理由

在这里插入图片描述

类(Class)通常由数据成员(Data Members)和函数成员(Member Functions)组成。

以下是表格形式的回答:

类型数据成员函数成员
作用存储对象的属性和状态执行与对象相关的操作
内容包含对象的属性值,可以是各种数据类型包含方法(函数),操作或修改数据成员的方式

示例解释:

  1. 作用:

    • 数据成员的作用是存储类的对象的状态或属性。
    • 函数成员的作用是定义类的行为,执行各种操作。
  2. 内容:

    • 数据成员包含类的属性,这些属性可以是整数、浮点数、字符等各种数据类型。
    • 函数成员包含类的方法,这些方法定义了对象的行为。函数成员可以访问和修改数据成员,执行某些操作。

理由:

  • :因为这是面向对象编程(OOP)的基本原则,类通过数据成员表示对象的状态,通过函数成员表示对象的行为。
  • :在一些特殊的编程语境中,可能存在只有数据成员或只有函数成员的情况,但这不是通常的面向对象编程范例。通常,数据成员和函数成员一起构成类,形成封装的概念。
特殊情况

程序员

“在一些特殊的编程语境中,可能存在只有数据成员或只有函数成员的情况”,举出实例以说明

在这里插入图片描述

在一些特殊的编程语境中,可能存在只有数据成员或只有函数成员的情况。下面是两个例子:

只有数据成员的情况:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

# 在这个例子中,Point 类只包含数据成员 x 和 y,没有定义任何方法。
# 这种情况可能在表示简单的数据结构时出现,不需要额外的行为,只需要存储数据。

只有函数成员的情况:

class Calculator:
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def subtract(x, y):
        return x - y

# 在这个例子中,Calculator 类只包含静态方法,没有实例变量。
# 这种情况可能在定义一组相关的功能时出现,这些功能不依赖于特定对象的状态。

这些例子突显了在某些情境下,一个类可能只包含数据成员或只包含函数成员,具体取决于设计和用途。

发问

那么我们就要问了,只存储数据,或者只存储方法能实现一个完整的程序吗?

显然是不能的

解释

程序员

那么只存储数据和只有函数成员是无法实现一个完整的程序的是吗

在这里插入图片描述

是的,通常情况下,只存储数据或者只有函数成员的类可能无法实现一个完整的程序。在实际开发中,我们通常需要结合数据和相关功能,使得类能够更好地模拟现实世界的对象或者提供所需的功能。

只存储数据的类: 这样的类可能无法完成实际的操作或者提供必要的功能。数据本身没有受到保护,也没有相关的行为。

只有函数成员的类: 这样的类可能缺乏存储状态的能力,无法在不同函数之间共享信息。没有数据的存储,类的实例无法保持状态或者记录信息。

一个完整的程序通常需要类既有数据成员用于存储状态,又有函数成员用于操作和处理这些数据。这种综合使用才能更好地满足程序的需求。

数据/函数成员

程序员

那么类中包含着哪些数据成员和函数成员呢?

在这里插入图片描述

数据成员函数成员
字段:类中的变量,用于存储对象的状态。方法: 类中定义的函数,用于执行特定的操作。
常量:类中的常量值,一旦设置不可更改。属性:类中对字段的封装,提供对字段的访问和修改。
构造函数:在创建对象时初始化对象的特定成员。
析构函数: 在对象销毁时执行的方法,用于清理资源等工作。
运算符: 重载类的运算符,允许对象参与特定类型的运算。
索引器: 允许对象像数组一样使用索引访问元素。
事件: 提供一种机制,允许类的实例与其他对象进行交互。

上文提到,数据成员配合函数成员才能实现一个完整的程序
那么一个程序中有多少个这样的组合呢?

类和程序–实现一个简单的程序

程序员

写一个图书馆系统程序,它的工作就是可以从中借阅书籍。它有三个类,分别是Book,Library和Reader,分别用来存储书籍信息,搜索书籍和存储读者信息,Book类中包含书籍标题,作者,书籍类型几个变量,Library类中可以实现添加,删除书籍功能,可以根据书籍类型搜索书籍,Reader类中包含读者姓名,已借阅书籍名称,类中可以实现借阅,归还书籍功能

在这里插入图片描述

类描述:

1. Book 类:
  • 数据成员:
    • Title: 书籍标题
    • Author: 作者
    • Genre: 书籍类型 (例如:小说、科幻、历史)
  • 函数成员:
    • DisplayDetails(): 显示书籍详细信息
2. Library 类:
  • 数据成员:
    • books: 存储图书馆中所有书籍的集合,初始化时包含一些示例书籍
  • 函数成员:
    • AddBook(book): 向图书馆添加一本书
    • RemoveBook(book): 从图书馆移除一本书
    • SearchByGenre(genre): 按照书籍类型搜索书籍
3. Reader 类:
  • 数据成员:
    • Name: 读者姓名
    • CurrentBooks: 读者当前借阅的书籍集合
  • 函数成员:
    • BorrowBook(book): 借阅一本书
    • ReturnBook(book): 归还一本书
    • ViewBorrowedBooks(): 查看当前借阅的书籍

程序实例化:

// 创建书籍对象
Book book1 = new Book("The Catcher in the Rye", "J.D. Salinger", "Novel");
Book book2 = new Book("1984", "George Orwell", "Dystopian Fiction");
Book book3 = new Book("To Kill a Mockingbird", "Harper Lee", "Classic");

// 创建图书馆对象
Library library = new Library();

// 向图书馆添加书籍
library.AddBook(book1);
library.AddBook(book2);
library.AddBook(book3);

// 创建读者对象
Reader reader1 = new Reader("Alice");
Reader reader2 = new Reader("Bob");

// 读者借阅和归还书籍
reader1.BorrowBook(book1);
reader2.BorrowBook(book2);
reader2.BorrowBook(book3);
reader1.ReturnBook(book1);

// 查看图书馆中特定类型的书籍
List<Book> novels = library.SearchByGenre("Novel");

// 查看读者当前借阅的书籍
reader2.ViewBorrowedBooks();

这个示例程序模拟了一个图书馆系统,包括图书馆管理书籍的功能、读者借阅和归还书籍的功能,以及按照书籍类型搜索书籍的功能。

实现尝试

程序员

要求这个程序可以在Windows窗体应用程序中实现,现补充具体描述
1、用一个表格代表图书馆,表格中的每一行由书籍的具体信息构成
如:《百年孤独》,马尔克斯,文学
2、点击表格的每一行,可以显示书籍的借阅状态
√ 可借阅 × 已借出
3、表格的下方,为一个按钮,点击按钮,可以向表格中添加书籍
4、按钮的下方,为读者姓名和读者当前借阅的书籍集合
如:雨果,《百年孤独》,《巴黎圣母院》

在这里插入图片描述

要实现以上要求,可以借助 C# 的 Windows 窗体应用程序。以下是一个简单的示例,使用 DataGridView 控件来表示图书馆,Button 控件用于添加书籍,以及在底部显示读者姓名和当前借阅的书籍。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace LibraryApp
{
    public partial class MainForm : Form
    {
        private Library library;
        private Reader currentReader;

        public MainForm()
        {
            InitializeComponent();
            InitializeLibrary();
        }

        private void InitializeLibrary()
        {
            library = new Library();
            // 添加一些示例书籍
            library.AddBook(new Book("The Catcher in the Rye", "J.D. Salinger", "Novel"));
            library.AddBook(new Book("1984", "George Orwell", "Dystopian Fiction"));
            library.AddBook(new Book("To Kill a Mockingbird", "Harper Lee", "Classic"));

            // 显示图书馆内容
            UpdateLibraryGridView();
        }

        private void UpdateLibraryGridView()
        {
            // 清空表格
            libraryGridView.Rows.Clear();

            // 添加每本书的信息到表格
            foreach (var book in library.GetBooks())
            {
                string[] bookInfo = { book.Title, book.Author, book.Genre, book.IsAvailable ? "√" : "×" };
                libraryGridView.Rows.Add(bookInfo);
            }
        }

        private void addButton_Click(object sender, EventArgs e)
        {
            // 打开添加书籍窗口
            AddBookForm addBookForm = new AddBookForm(AddBookToLibrary);
            addBookForm.ShowDialog();
        }

        private void AddBookToLibrary(Book book)
        {
            library.AddBook(book);
            UpdateLibraryGridView();
        }

        private void libraryGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // 点击表格的每一行,显示借阅状态
            if (e.RowIndex >= 0 && e.RowIndex < libraryGridView.Rows.Count)
            {
                string bookTitle = libraryGridView.Rows[e.RowIndex].Cells[0].Value.ToString();
                Book selectedBook = library.GetBookByTitle(bookTitle);

                if (selectedBook != null)
                {
                    MessageBox.Show($"借阅状态:{(selectedBook.IsAvailable ? "可借阅" : "已借出")}");
                }
            }
        }

        private void borrowButton_Click(object sender, EventArgs e)
        {
            // 模拟读者借阅书籍
            currentReader = new Reader("雨果");
            currentReader.BorrowBook(library.GetBookByTitle("The Catcher in the Rye"));
            currentReader.BorrowBook(library.GetBookByTitle("1984"));

            // 更新读者信息
            UpdateReaderInfo();
        }

        private void UpdateReaderInfo()
        {
            // 显示读者姓名
            readerNameLabel.Text = $"读者姓名:{currentReader.Name}";

            // 显示读者当前借阅的书籍
            currentBooksLabel.Text = $"当前借阅:{string.Join(",", currentReader.GetCurrentBooks())}";
        }
    }
}

请注意,上述示例只是演示了如何在 Windows 窗体应用程序中实现要求的功能。你可能需要创建相应的窗体和控件,并将代码适配到你的具体环境和需求。

不好意思诸位,目前还没有测试成功,容我再研究研究,之后再行更新
今天我们接着往下看

声明类

对于由C#定义的类型,我们可以直接使用,如int、double,但也有些类型如Person ,Car,这些我们自己定义的类型,需要通过class关键字声明才能使用
示例代码如下

class Person
{
    // 数据成员
    string name;
    int age;

    // 构造函数
    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }

    // 函数成员
    public void Greet()
    {
        Console.WriteLine("Hello, my name is {0} and I'm {1} years old.", name, age);
    }

    public void CelebrateBirthday()
    {
        age++;
        Console.WriteLine("Happy Birthday! Now I'm {0} years old.", age);
    }
}

class Car
{
    // 数据成员
    string model;
    int year;

    // 构造函数
    public Car(string model, int year)
    {
        this.model = model;
        this.year = year;
    }

    // 函数成员
    public void StartEngine()
    {
        Console.WriteLine("Engine started for {0} {1}.", year, model);
    }

    public void Drive()
    {
        Console.WriteLine("{0} {1} is now driving.", year, model);
    }
}

类的成员

我们刚才说到类的成员有很多,但是只有字段方法是最重要的类成员类型,字段是数据成员,方法是函数成员

字段

程序员

说说你对类的成员“字段”的理解
在这里插入图片描述
字段(Field):

字段是类的成员之一,用于保存数据。每个字段都有一个类型和一个标识符,可以被读取。

声明字段:

class MyClass
{
    int F1 = 17;         // 隐式初始化,初始值为 17
    string F2;           // 隐式初始化,默认值为 null
    int F3 = 25;         // 显式初始化,初始值为 25
    string F4 = "abcd";  // 显式初始化,初始值为 "abcd"
}

字段初始化:

字段可以通过等号后面跟着一个求值表达式进行初始化。如果没有初始化语句,字段的值会被编译器设为默认值,由字段的类型决定。

多个字段声明:

可以通过逗号分隔名称的方式,在同一条语句中声明多个相同类型的字段。不能在一个声明中混合不同类型的字段。

class MyClass
{
    int F1, F3 = 25;      // 声明两个 int 类型字段,F1 隐式初始化为 0
    string F2, F4 = "abcd"; // 声明两个 string 类型字段,F2 隐式初始化为 null
}

这样,字段在类中起到保存数据的作用,可以根据需要进行初始化。

方法

程序员

说说你对类的成员“方法”的理解
在这里插入图片描述
方法(Method):

方法是具有名称的可执行代码块,可以从程序的不同地方执行,甚至可以在其他程序中执行。方法执行包含在其代码块中,并在完成后返回到调用它的位置。

声明方法:

class SimpleClass
{
    // 无返回值的方法
    void PrintNums()
    {
        Console.WriteLine("1");
        Console.WriteLine("2");
    }
}

方法特征:

  • 返回类型: 方法声明了返回值的类型。如果方法不返回值,返回类型被指定为 void
  • 方法名: 方法有一个名字,用于标识和调用它。
  • 参数列表: 方法可以有参数,参数通过一对空的圆括号表示。如果有参数,它们将在圆括号内列出。

注意事项:

  • C#中没有全局函数,所有方法必须声明在类型声明内部。
  • 方法必须包含返回类型或 void,没有默认的返回类型。

这样,方法在类中定义了可执行的操作,可以在程序中被调用执行。

总结

刚见面就要说再见,道友们,今天我们学习了C#类的相关知识,个中不足,还望谅解,后有时间会补充更新,感谢大家的喜爱,喜欢本文的话,给博主点个赞吧!记得收藏加关注哦!道友们的支持就是我更新的源动力!
回到顶部

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/324968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[笔记]深度学习入门 基于Python的理论与实现(一)

代码仓库 gitee 1. python 入门 1.5之前是python安装和基础语法, 我直接跳过了 1.5 Numpy 深度学习中经常出现数组和矩阵运算&#xff0c;Numpy 的数组类 numpy.array 提供了很多便捷的方法 1.5.1 导入 Numpy import numpy as np1.5.2 生成 Numpy 数组 np.array()&#xf…

C# wpf 实现任意控件(包括窗口)更多调整大小功能

WPF拖动改变大小系列 第一节 Grid内控件拖动调整大小 第二节 Canvas内控件拖动调整大小 第三节 窗口拖动调整大小 第四节 附加属性实现拖动调整大小 第五章 拓展更多调整大小功能&#xff08;本章&#xff09; 文章目录 WPF拖动改变大小系列前言一、添加的功能1、任意控件Drag…

Vant2组件的使用

组件地址&#xff1a;Vant 2 - Mobile UI Components built on VueMobile UI Components built on Vuehttps://vant-contrib.gitee.io/vant/v2/#/zh-CN/ 通过 npm 安装 # Vue 3 项目&#xff0c;安装最新版 Vant&#xff1a; npm i vant -S # Vue 2 项目&#xff0c;安装 Va…

transfomer中Decoder和Encoder的base_layer的源码实现

简介 Encoder和Decoder共同组成transfomer,分别对应图中左右浅绿色框内的部分. Encoder&#xff1a; 目的&#xff1a;将输入的特征图转换为一系列自注意力的输出。 工作原理&#xff1a;首先&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;提取输入图像的特征。然…

Java集合之LinkedList源码篇

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

自动化测试:fixture学得好,Pytest测试框架用到老

在pytest中&#xff0c;fixture是一种非常有用的特性&#xff0c;它允许我们在测试函数中注入数据或状态&#xff0c;以便进行测试。而参数化则是fixture的一个特性&#xff0c;它允许我们将不同的数据传递给fixture&#xff0c;从而进行多次测试。 本文将介绍如何在pytest中使…

任务14:使用MapReduce提取全国每年最低/最高气温

任务描述 知识点&#xff1a; 使用MapReduce提取数据 重 点&#xff1a; 开发MapReduce程序统计每年每个月的最低气温统计每年每个月的最高气温 内 容&#xff1a; 使用IDEA创建一个MapReduce项目开发MapReduce程序使用MapReduce统计每年每个月的最低气温使用MapReduce…

docker搭建SSH镜像、systemctl镜像、nginx镜像、tomcat镜像

目录 一、SSH镜像 二、systemctl镜像 三、nginx镜像 四、tomcat镜像 五、mysql镜像 一、SSH镜像 1、开启ip转发功能 vim /etc/sysctl.conf net.ipv4.ip_forward 1sysctl -psystemctl restart docker 2、 cd /opt/sshd/vim Dockerfile 3、生成镜像 4、启动容器并修改ro…

快速上手:Tomact集群配置(图文并茂)

目录 博客前言&#xff1a; 一.前期准备工作 1 .Tomcat集群架构图 2. 准备工具 二.配置集群 1.tomact配置 1.1首先解压一个tomact 1.2 解压后再准备2个tomcat 1.3修改第二个的端口号 ​编辑 1.4修改默认页面 ​编辑1.5启动8080的tomact 2.nginx 安装配置 2.1.安装…

Spring框架的背景学习

Spring 的前世今生 相信经历过不使用框架开发 Web 项目的 70 后、80 后都会有如此感触&#xff0c;如今的程序员开发项目太轻松了&#xff0c;基本只需要关心业务如何实现&#xff0c;通用技术问题只需要集成框架便可。早在 2007 年&#xff0c;一个基于 Java语言的开源框架正…

Onenote是什么?笔记软件Onenote使用指南:简介|功能|下载|替代软件

OneNote是什么&#xff1f; OneNote是微软公司开发的一款强大的笔记软件&#xff0c;它允许用户在各种设备上创建、组织和搜索笔记。OneNote以其灵活的布局和强大的编辑功能而闻名&#xff0c;它可以帮助个人和团队记录信息、规划项目、协作和分享知识。 *笔记软件OneNote On…

彝族民居一大特色——土掌房

彝族民居一大特色——土掌房在彝区&#xff0c;各地、各支系传承的居室建筑形式是多种多样的&#xff0c;并与当地的居住习俗有密切关联&#xff0c;从村寨的聚落到住宅的地址&#xff1b;从房间的分置到什物的堆放&#xff1b;从建筑结构到民居信仰和禁忌&#xff0c;都表现出…

【学习心得】图解Git命令

图解Git命令的图片是在Windows操作系统中的Git Bash里操作截图。关于Git的下载安装和理论学习大家可以先看看我写的另两篇文章。链接我放在下面啦&#xff1a; 【学习心得】Git快速上手_git学习心得-CSDN博客 【学习心得】Git深入学习-CSDN博客 一、初始化仓库 命令&#xff…

通用外设-W25Q64

前言 一、SPI通信 二、W25Q64基初时序 1.各种命令代码 2.代码 1.写使能指令 2.读取芯片是否忙碌状态并等待 3.写入数据 4.擦除函数操作 5.读取代码 三.验证 四.擦除说明 总结 前言 在单片机中一般32K FLASH就够用了&#xff0c;但是当我们使用图片或其他大量数据时…

支持华为GaussDB数据库的免费开源ERP:人力资源管理解决方案概述

开源智造所推出的Odoo SuperPeople数字化解决方案将HR和薪资数据与财务、项目规划、预算和采购流程连接起来&#xff0c;消除了多套系统给企业带来的信息孤岛问题。 ——复星集团 人力资源中心 高经理 一种更具吸引力、更有洞察力的人员管理方式 什么是开源智造Odoo的人力资源…

每日一练:LeeCode-102、二又树的层序遍历【二叉树】

本文是力扣LeeCode-102、二又树的层序遍历 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&…

【数据结构】哈希表详解,举例说明 java中的 HashMap

一、哈希表&#xff08;Hash Table&#xff09;简介&#xff1a; 哈希表是一种数据结构&#xff0c;用于实现字典或映射等抽象数据类型。它通过把关键字映射到表中的一个位置来实现快速的数据检索。哈希表的基本思想是利用哈希函数将关键字映射到数组的索引位置上&#xff0c;…

java多线程(并发)夯实之路-volatile深入浅出

volatile volatile&#xff08;易变关键字&#xff09;可以用来修饰成员变量和静态成员变量&#xff0c;线程只能从主存中获取它的值&#xff0c;线程操作volatile变量都是直接操作主存 与synchronzied区别&#xff1a;synchronzied需要创建Monitor&#xff0c;属于重量级的操…

读书笔记——《未来简史》

前言 《未来简史》是以色列历史学家尤瓦尔赫拉利的人类简史三部曲之一。三部分别为《人类简史》《未来简史》《今日简史》。其中最为著名的当然是《人类简史》&#xff0c;非常宏大的一本关于人类文明历史的书籍&#xff0c;绝对可以刷新历史观&#xff0c;《人类简史》这本书…