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

news2024/12/27 13:14:46

目录

一、涉及到的知识点

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.coloradmin.cn/o/1443991.html

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

相关文章

专业138+总分400+南京航空航天大学878数电信号考研经验南航电子信息与通信,真题,大纲,参考书

经过一年的复习&#xff0c;顺利被南京航空航天大学录取&#xff0c;初试专业课878数字电路和信号与系统138&#xff0c;总分400&#xff0c;回看这一年的复习&#xff0c;从择校到考研备考经历了很多&#xff0c;也有很多想和大家分享的复习经验&#xff0c;希望对大家复习有所…

网络的基本概念和socket编程

网络的基本概念 1.协议1.1 协议的基本概念1.2 常见的协议 2.分层模型2.1网络七层OSI 7层模型&#xff1a;物数网传会表应(口诀)2.2TCP/IP模型2.3数据通信的过程2.4网络的设计模式2.5以太网帧的格式 3.SOCKET编程3.1网络字节序3.2 相关结构体和函数3.3 代码实现 1.协议 1.1 协议…

【Linux】学习-深入了解文件的读与写

深入了解语言级别(C语言)文件操作的"读"与"写" 在学习前&#xff0c;我们先要知道在Linux下的一个原则&#xff1a;一切皆是文件 如何理解呢&#xff1f;举个外设的例子&#xff0c;比如键盘和显示器&#xff0c;这两个外设也可以其实本质上也是文件&…

springboot+vue电影推荐系统 java电影院售票选座系统1r6m2

用户模块 1)注册&#xff1a;用户输入账号、密码、确认密码、昵称、手机、邮箱、简介&#xff0c;点击注册按钮&#xff0c;完成注册。 2)登录&#xff1a;用户成功输入用户账号和密码&#xff0c;点击登录按钮。 3)用户主页面&#xff1a;以用户登录成功后&#xff0c;可以查看…

基于vue+node.js的校园跳蚤市场系统多商家

校园跳蚤市场系统可以在短时间内完成大量的数据处理、帮助用户快速的查找校园跳蚤市场相关信息&#xff0c;实现的效益更加直观。校园跳蚤市场系统中采用nodejs技术和mysql数据库。主要包括管理员、发布者和用户三大部分&#xff0c;主要功能是实现对个人中心、用户管理、发布者…

机器学习复习(8)——逻辑回归

目录 逻辑函数&#xff08;Logistic Function&#xff09; 逻辑回归模型的假设函数 从逻辑回归模型转换到最大似然函数过程 最大似然函数方法 梯度下降 逻辑函数&#xff08;Logistic Function&#xff09; 首先&#xff0c;逻辑函数&#xff0c;也称为Sigmoid函数&#…

Peter算法小课堂—单调队列

祝大家新年快乐&#xff01; 今天这一次有点简单。 单调队列有两个要点&#xff0c;一个是单调&#xff0c;另一个就是我们的队列。 听到队列&#xff0c;我相信大家一定会想到它的好朋友BFS吧。但是……今天……可……没……那么……简单哦。 西佳佳偶像天团1 题目描述 …

M1 Mac使用SquareLine-Studio进行LVGL开发

背景 使用Gui-Guider开发遇到一些问题&#xff0c;比如组件不全。使用LVGL官方的设计软件开发 延续上一篇使用的基本环境。 LVGL项目 新建项目 选择Arduino的项目&#xff0c;设定好分辨率及颜色。 设计UI 导出代码 Export -> Create Template Project 导出文件如图…

1978-2023年全国国内生产总值、分产业分行业增加值相关指标数据

1978-2023年全国国内生产总值、分产业分行业增加值相关指标数据 1、时间&#xff1a;1978-2023年 2、指标&#xff1a;国内生产总值(亿元)、第一产业增加值(亿元)、第二产业增加值(亿元)、第三产业增加值(亿元)、人均国内生产总值(元)、国民总收入指数(上年100)、国内生产总值…

车载电子电器架构 —— 电子电气系统车载功能子系统

车载电子电器架构 —— 电子电气系统车载功能子系统 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 本就是小人物&#xff0c;输了就是输了&#xff0c…

Linux 从日志中抽取信息,批量生成SQL语句并执行

这里写目录标题 一. 需求分析二. 从日志中抽取出指定字段&#xff0c;并切分为若干个子文件三. 生成查询执行计划四. 生成查询的SQL语句五. 检查并执行 一. 需求分析 有如下日志文件&#xff0c;假设日志文件中有10000条数据&#xff0c;要求将全部的TRANSACTIONID抽取出来&am…

在VSCode中创建Java项目

在VSCode中创建Java项目 首先&#xff0c;保证安装了Java的JDK. WinR -> 输入cmd -> 输入 java -version -> 然后可以看到安装的JDK版本&#xff0c;如果没安装可以去找教程。 JDK安装参考教程 打开VSCode&#xff0c;打开扩展&#xff08;Ctrl Shift S&#xff…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之AlphabetIndexer组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、AlphabetIndexer组件 可以与容器组件联动用于按逻辑结构快速定位容器显…

每日五道java面试题之java基础篇(四)

第一题. 访问修饰符 public、private、protected、以及不写&#xff08;默认&#xff09;时的区别&#xff1f; Java 中&#xff0c;可以使⽤访问控制符来保护对类、变量、⽅法和构造⽅法的访问。Java ⽀持 4 种不同的访问权限。 default (即默认&#xff0c;什么也不写&…

Elasticsearch:混合搜索是 GenAI 应用的未来

在这个竞争激烈的人工智能时代&#xff0c;自动化和数据为王。 从庞大的存储库中有效地自动化搜索和检索信息的过程的能力变得至关重要。 随着技术的进步&#xff0c;信息检索方法也在不断进步&#xff0c;从而导致了各种搜索机制的发展。 随着生成式人工智能模型成为吸引力的中…

【Python如何求出所有3位数的回文数】

回文数就是正向读和逆向读都相同的数&#xff0c;如66&#xff0c;626&#xff0c;72127 1、求出所有3位数的回文数python代码如下&#xff1a; # 输出所有3位数的回文数 for i in range(100, 1000): # 从100循环到999&#xff0c;不包含1000if str(i) str(i)[::-1]: # 如…

CSS3 基本语法

CSS3 基本语法 1. CSS3 新增长度单位 rem 根元素字体大小的倍数&#xff0c;只与根元素字体大小有关。vw 视口宽度的百分之多少 10vw 就是视口宽度的 10% 。vh 视口高度的百分之多少 10vh 就是视口高度的 10% 。vmax 视口宽高中大的那个的百分之多少。&#xff08;了解即可&am…

centos中docker操作+安装配置django并使用simpleui美化管理后台

一、安装docker 确保系统是CentOS 7并且内核版本高于3.10,可以通过uname -r命令查看内核版本。 更新系统软件包到最新版本,可以使用命令yum update -y。 安装必要的软件包,包括yum-utils、device-mapper-persistent-data和lvm2。使用命令yum install -y yum-utils devic…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏10(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言快捷栏绘制UI代码控制快捷列表信息 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&#xff0c;我们将探索如何制作…

C语言-----自定义类型-----结构体枚举联合

结构体和数组一样&#xff0c;都是一群数据的集合&#xff0c;不同的是数组当中的数据是相同的类型&#xff0c;但是结构体中的数据类型可以不相同&#xff0c;结构体里的成员叫做成员变量 结构体类型是C语言里面的一种自定义类型&#xff0c;我们前面已经了解到过int,char,fl…