C#计算矩形面积:通过定义结构 vs 通过继承类

目录

一、涉及到的知识点

1.结构

2.结构和类的区别

3.继承

4.使用类继承提高程序的开发效率

5.属性 

(1)属性定义

(2)get访问器

(3)set访问器

6. 属性和字段的区别

二、实例:通过定义结构计算矩形面积

1.源码

2.生成效果

三、实例:通过继承类计算梯形面积

1.源码

2.生成效果


一、涉及到的知识点

1.结构

        结构是一种可以包含数据成员和方法成员的值类型数据结构。为结构分配数据时不需要从托管堆中分配内存,结构类型的变量直接包含了该结构的数据。结构中可以包括构造函数、常量、字段、方法、属性、运算符、事件和嵌套类型等,但如果要同时包括上述几种成员,则应该考虑使用类。

        使用结构对于小的数据结构特别有用,能够节省大量的分配内存,如复数和坐标系中的点。结构具有以下特点:

  • 结构是值类型。
  • 向方法传递结构时,是通过传值方式传递的,而不是作为引用传递的。
  • 结构的实例化可以不使用new运算符。
  • 结构可以声明构造函数,但它们必须带参数。
  • 一个结构不能从另一个结构或类继承。所有结构都直接继承自System.ValueType,而System.ValueType继承自System.Object。
  • 结构可以实现接口。
  • 在结构中初始化实例字段是错误的。

        由于结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值来实现默认构造函数。

        C#中,使用struct关键字来定义结构,语法格式如下:       

 【结构修饰符】 struct 【结构名】{}

2.结构和类的区别

        结构是值类型,它在栈上分配数据,并且结构的赋值将分配产生一个新的对象;

        而类是引用类型,它在堆上分配数据,对类的对象进行赋值时只是复制了引用,它们都指向同一个实际对象分配的内存。

3.继承

        继承是面向对象编程最重要的特性之一,任何类都可以从另外一个类继承,这就是说,这个类拥有它继承的类的所有成员。在面向对象编程中,被继承的类称为父类或基类。C#中提供了类的继承机制,但只支持单继承,而不支持多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类。

        利用类的继承机制,程序开发人员可以在已有类的基础上构造新类,这一性质使得类支持分类的概念。例如,用户可以通过增加、修改或替换类中的方法对这个类进行扩充,以适应不同的应用要求。在日常生活中很多东西都很有条理,那是因为它们有着很好的层次分类,如果不用层次分类,则需要对每个对象都定义其所有的性质。使用继承后,每个对象就可以只定义自己的特殊性质,每一层的对象只需定义本身的性质,其他性质可以从上一层继承下来。

        继承一个类时,类成员的可访问性是一个重要的问题。子类(派生类)不能访问基类的私有成员,但是可以访问其公共成员,这就是说,只要使用public声明类成员,就可以让一个类成员被基类和子类(派生类)同时访问,同时也可以被外部的代码访问。

        为了解决基类成员访问问题,C#还提供了另外一种可访问性,即protected,只有子类(派生类)才能访问protected成员,基类和外部代码都不能访问protected成员。

        除了可以定义成员的保护级别外,还可以为成员定义其继承行为。基类的成员可以是虚拟的,成员可以由继承它的类重写。子类(派生类)可以提供成员的其他执行代码,这种执行代码不会删除原来的代码,仍可以在类中访问原来的代码,但外部代码不能访问它们。如果没有提供其他执行方式,外部代码就直接访问基类中成员的执行代码。

        另外,基类还可以定义为抽象类。抽象类不能直接实例化,要使用抽象类就必须继承这个类,然后再实例化。C#中实现继承的语法格式如下:

class DerivedClass:BaseClass {}
说明:继承类时,必须在子类和基类之间使用冒号(:)。

4.使用类继承提高程序的开发效率

        类可以从另外一个类继承,也就是说,这个类拥有它继承的类的所有成员(除构造方法外)。利用类的继承机制,程序开发人员可以在已有类的基础上构造新类,从而更快地提高程序的开发效率。

5.属性 

         在定义类尤其定义基类时离不开对属性的声明。 属性定义的过程中需要用到get访问器和set访问器。

(1)属性定义

        属性是对现实实体特征的抽象,它提供了对类或对象性质的访问。类的属性描述的是状态信息,在类的实例中,属性的值表示对象的状态值。属性不表示具体的存储位置,属性有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句。所以属性提供了一种机制,把读取和写入对象的某些特性与一些操作关联起来,程序员可以像使用公共数据成员一样使用它。属性的声明格式如下:

【修饰符】【类型】【属性名】
{get {get访问器体}set {set访问器体}
}
参数说明
修饰符:指定属性的访问级别。
类型:指定属性的类型,可以是任何的预定义或自定义类型。
属性名:一种标识符,命名规则与字段相同,但是,属性名的第一个字母通常都大写。

(2)get访问器

        get访问器相当于一个具有属性类型返回值的无参数方法,它除了作为赋值的目标外,当在表达式中引用属性时,将调用该属性的get访问器计算属性的值。get访问器体必须用return语句来返回,并且所有的return语句都必须返回一个可隐式转换为属性类型的表达式。

(3)set访问器

        set访问器相当于一个具有单个属性类型值参数和void返回类型的方法。set访问器的隐式参数始终命名为value。当一个属性作为赋值的目标被引用时就会调用set访问器,所传递的参数将提供新值。不允许set访问体中的return语句指定表达式。由于set访问器存在隐式的参数value,所以set访问器中不能自定义使用名称为value的局部变量或常量。

        由于set访问器中可以包含大量的语句,因此可以对赋予的值进行检查,如果值不安全或者不符合要求,就给予提示,这样可以避免因为给属性设置了错误的值而导致的错误。

6. 属性和字段的区别

        属性和字段都可以访问对象中包含的数据。对象数据用来区分不同的对象,同一个类的不同对象可能在属性和字段中存储了不同的值。字段和属性都可以输入,通常把信息存储在字段和属性中,但是属性和字段是不同的,属性不能直接访问数据,字段可以直接访问数据。在属性中可以添加对数据访问的限制,例如,有一个int类型的属性,可以限制它只能存储1~5的数字,但如果用字段就可以存储任何int类型的数值。

二、实例:通过定义结构计算矩形面积

1.源码

//定义一个结构,然后通过结构计算矩形面积
namespace _112
{public partial class Form1 : Form{private GroupBox? groupBox1;private TextBox? textBox2;private TextBox? textBox1;private Label? label2;private Label? label1;private Label? label3;private TextBox? textBox3;private Button? button1;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // label1// label1 = new Label{AutoSize = true,Location = new Point(16, 30),Name = "label1",Size = new Size(32, 17),TabIndex = 0,Text = "长:"};// // label2// label2 = new Label{AutoSize = true,Location = new Point(16, 57),Name = "label2",Size = new Size(32, 17),TabIndex = 1,Text = "宽:"};// // textBox1// textBox1 = new TextBox{Location = new Point(76, 24),Name = "textBox1",Size = new Size(100, 23),TabIndex = 2};// // textBox2// textBox2 = new TextBox{Location = new Point(76, 51),Name = "textBox2",Size = new Size(100, 23),TabIndex = 3};// // groupBox1// groupBox1 = new GroupBox{Location = new Point(12, 12),Name = "groupBox1",Size = new Size(190, 81),TabIndex = 0,TabStop = false,Text = "矩形参数:"};groupBox1.Controls.Add(textBox2);groupBox1.Controls.Add(textBox1);groupBox1.Controls.Add(label2);groupBox1.Controls.Add(label1);groupBox1.SuspendLayout();// // label3// label3 = new Label{AutoSize = true,Location = new Point(12, 105),Name = "label3",Size = new Size(44, 17),TabIndex = 4,Text = "面积:"};// // textBox3// textBox3 = new TextBox{Location = new Point(67, 99),Name = "textBox3",Size = new Size(77, 23),TabIndex = 5};// // button1// button1 = new Button{Location = new Point(155, 99),Name = "button1",Size = new Size(47, 23),TabIndex = 6,Text = "计算",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(214, 131);Controls.Add(button1);Controls.Add(label3);Controls.Add(textBox3);Controls.Add(groupBox1);Name = "Form1";Text = "定义结构计算面积";groupBox1.ResumeLayout(false);groupBox1.PerformLayout();}/// <summary>/// 按钮事件/// </summary>private void Button1_Click(object? sender, EventArgs e){Rectangle myRectangle = new(Convert.ToDouble(textBox1!.Text), Convert.ToDouble(textBox2!.Text));textBox3!.Text = myRectangle.RectangleArea().ToString();}/// <summary>/// 使用自定义构造函数实例化矩形结构/// 构造函数,初始化矩形的宽和高/// 计算矩形的面积/// </summary>/// <param name="x">矩形的宽</param>/// <param name="y">矩形的高</param>public struct Rectangle(double x, double y){public double width = x;public double height = y;/// <summary>/// 计算矩形面积/// </summary>/// <returns>矩形面积</returns>public readonly double RectangleArea(){return width * height;}}}
}

2.生成效果

 

三、实例:通过继承类计算梯形面积

1.源码

//通过继承类计算梯形的面积
namespace _113
{public partial class Form1 : Form{private GroupBox? groupBox1;private TextBox? textBox3;private TextBox? textBox2;private TextBox? textBox1;private Label? label3;private Label? label2;private Label? label1;private Label? label4;private TextBox? textBox4;private Button? button1;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // textBox3// textBox3 = new TextBox{Location = new Point(83, 80),Name = "textBox3",Size = new Size(100, 23),TabIndex = 5};// // textBox2// textBox2 = new TextBox{Location = new Point(83, 48),Name = "textBox2",Size = new Size(100, 23),TabIndex = 4};// // textBox1// textBox1 = new TextBox{Location = new Point(83, 16),Name = "textBox1",Size = new Size(100, 23),TabIndex = 3};// // label3// label3 = new Label{AutoSize = true,Location = new Point(11, 86),Name = "label3",Size = new Size(32, 17),TabIndex = 2,Text = "高:"};// // label2// label2 = new Label{AutoSize = true,Location = new Point(11, 54),Name = "label2",Size = new Size(44, 17),TabIndex = 1,Text = "下底:"};// // label1// label1 = new Label{AutoSize = true,Location = new Point(11, 22),Name = "label1",Size = new Size(44, 17),TabIndex = 0,Text = "上底:"};// // groupBox1// groupBox1 = new GroupBox{Location = new Point(12, 12),Name = "groupBox1",Size = new Size(200, 118),TabIndex = 0,TabStop = false,Text = "梯形参数:"};groupBox1.Controls.Add(textBox3);groupBox1.Controls.Add(textBox2);groupBox1.Controls.Add(textBox1);groupBox1.Controls.Add(label3);groupBox1.Controls.Add(label2);groupBox1.Controls.Add(label1);groupBox1.SuspendLayout();// // label4// label4 = new Label{AutoSize = true,Location = new Point(12, 142),Name = "label4",Size = new Size(68, 17),TabIndex = 1,Text = "梯形面积:"};// // textBox4// textBox4 = new TextBox{Location = new Point(77, 136),Name = "textBox4",Size = new Size(70, 23),TabIndex = 2};// // button1// button1 = new Button{Location = new Point(168, 136),Name = "button1",Size = new Size(44, 23),TabIndex = 3,Text = "计算",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(224, 166);Controls.Add(button1);Controls.Add(textBox4);Controls.Add(label4);Controls.Add(groupBox1);Name = "Form1";Text = "通过继承计算面积";groupBox1.ResumeLayout(false);groupBox1.PerformLayout();}/// <summary>/// 按钮事件:实例化类对象/// 计算梯形面积/// </summary>private void Button1_Click(object? sender, EventArgs e){TrapeziaArea myTrapezoid = new(){SD = Convert.ToDouble(textBox1!.Text),XD = Convert.ToDouble(textBox2!.Text),Height = Convert.ToDouble(textBox3!.Text)};textBox4!.Text = myTrapezoid.Area().ToString();}}/// <summary>/// 自定义Trapezia类/// 该类定义了3个属性/// </summary>class Trapezia{private double sd = 0;      //定义int型变量,作为梯形的上底private double xd = 0;      //定义int型变量,作为梯形的下底private double height = 0;  //定义int型变量,作为梯形的高/// <summary>/// 上底/// </summary>public double SD{get{return sd;}set{sd = value;}}/// <summary>/// 下底/// </summary>public double XD{get{return xd;}set{xd = value;}}/// <summary>/// 高/// </summary>public double Height{get{return height;}set{height = value;}}}/// <summary>/// 自定义类,该类继承自Trapezia/// 继承了父类的3个属性/// </summary>class TrapeziaArea : Trapezia{/// <summary>/// 求梯形的面积/// </summary>/// <returns>梯形的面积</returns>public double Area(){return (SD + XD) * Height / 2;}}
}

2.生成效果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[word] word表格表头怎么取消重复出现? #媒体#笔记#职场发展

word表格表头怎么取消重复出现&#xff1f; word表格表头怎么取消重复出现&#xff1f;在Word中的表格如果过长的话&#xff0c;会跨行显示在另一页&#xff0c;如果想要在其它页面上也显示表头&#xff0c;更直观的查看数据。难道要一个个复制表头吗&#xff1f;当然不是&…

idea:如何连接数据库

1、在idea中打开database: 2、点击 ‘’ ---> Data Source ---> MySQL 3、输入自己的账号和密码其他空白处可以不填&#xff0c;用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库&#xff0c;点击运用ok&#xff0c;等待刷新即可 最后&#xff1a…

springboot179基于javaweb的流浪宠物管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

disql备份还原

disql备份还原 前言 本文档根据官方文档&#xff0c;进行整理。 一、概述 在 disql 工具中使用 BACKUP 语句你可以备份整个数据库。通常情况下&#xff0c;在数据库实例配置归档后输入以下语句即可备份数据库&#xff1a; BACKUP DATABASE BACKUPSET db_bak_01;语句执行完…

C++进阶(十四)智能指针

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、为什么需要智能指针&#xff1f;二、内存泄漏1、 什么是内存泄漏&#xff0c;内存泄漏的危…

量子位 | 2024年AI还能帮你干什么?这十个趋势必须关注

本文来源公众号“量子位”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;2024年AI还能帮你干什么&#xff1f;这十个趋势必须关注 大年初三&#xff0c;也不要忘记学习&#xff01;新的一年里&#xff0c;怎样能让AI多给自己帮帮…

【数据结构】13:表达式转换(中缀表达式转成后缀表达式)

思想&#xff1a; 从头到尾依次读取中缀表达式里的每个对象&#xff0c;对不同对象按照不同的情况处理。 如果遇到空格&#xff0c;跳过如果遇到运算数字&#xff0c;直接输出如果遇到左括号&#xff0c;压栈如果遇到右括号&#xff0c;表示括号里的中缀表达式已经扫描完毕&a…

每日一练:LeeCode-654、最大二叉树【二叉树+DFS+分治】

本文是力扣LeeCode-654、最大二叉树【二叉树DFS分治】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其…

python安装cv2失败

问题:安装cv2包失败 解决方法&#xff1a; pip install opencv-python或在Anaconda中conda install opencv-python

蓝牙BLE学习-蓝牙广播

1.概念 什么叫做广播&#xff0c;顾名思义就像广场上的大喇叭一样&#xff0c;不停的向外传输着信号。不同的是&#xff0c;大喇叭传输的是音频信号&#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息&#xff0c;就是将数据编码&#xff0c;调制到射频信号中发…

基于Robei EDA--实现串口通信

一、串口简介 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#xff0c;在设计众多通信接口和调试时占有重要地位。但UART和SPI、IIC不同的是&#xff0c;它是异步通信接口&#xff0c;异步通信中的接收方并不知道数据什么时候会到达&#xff0c;所…

【后端高频面试题--SpringBoot篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 这里写目录标题 1.什么是SpringBoot&#xff1f;它的主要特点是什么&#xff1f;2.列举一些Spri…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用&#xff1a;网页的调色盘4.1.1 基础知识4.1.2 重点案例&#xff1a;创建一个具有情感设计的登录页面4.1.3 拓展案例 1&#xff1a;使用颜色增强信息的可视化表示4.1.4 拓展案例 2&#xff1a;利用颜色创建网站的品牌身份 4.2 字体与文…

书生·浦语大模型第四课作业

基础作业&#xff1a; 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手&#xff0c;效果如下图所示&#xff0c;本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称&#xff01; 1.安装 # 如果你是在 Int…

Java是如何实现的平台无关?

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 1、什么是平台无关性 平台无关性就是一种语言在…

寒假作业

手写盗版微信登入界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(421,575);this->setFixedSize(421,575);th…

接口测试框架分析

框架大体上已经写完了&#xff0c;不过说实话好多代码让我自己写我也写不出来&#xff0c;那该怎么办呢&#xff1f;很简单&#xff0c;把现在已经写好的代码保存起来&#xff0c;等用的时候拿出来复制粘贴就好了&#xff0c;如果你是大神&#xff0c;自己会写&#xff0c;那就…

TikTok:短视频时代的崛起

导言&#xff1a; TikTok&#xff0c;作为一款全球短视频社交应用&#xff0c;正风靡全球&#xff0c;引领着数字娱乐的新潮流。其简洁的用户界面、创意无限的短视频内容&#xff0c;以及强大的社交互动功能&#xff0c;使其成为全球数以亿计的用户喜爱的平台。 TikTok的特点&a…

H5 红色文字抖动网址发布页/引导页源码

H5 红色文字抖动网址发布页/引导页源码 源码介绍&#xff1a;一款红色文字抖动网页源码&#xff0c;可用于引导页或网址发布页。 下载地址&#xff1a; https://www.changyouzuhao.cn/10470.html