C#通过继承泛型类来分块显示学生的个人信息以及成绩信息

目录

一、涉及到的知识点

1.泛型类的继承

2.泛型类的可视化

(1)用UML图说明泛型类的可视化

(2)用实例说明泛型类的可视化

二、实例1

1.源码

2.生成效果

三、实例2


        再发一个继承泛型类的应用案例。

一、涉及到的知识点

1.泛型类的继承

       泛型类的继承是指一个泛型类(也称为参数化类)可以被另一个泛型类继承。这允许创建一个具有共同特征的类层次结构,同时保持类型安全和避免运行时错误。 

        泛型类的继承与普通类的继承是类似的,只是在继承时多了一个类型参数T。语法格式如下:

class DerivedClass <类型参数T>:BaseClass <类型参数T>

2.泛型类的可视化

        泛型类型也可以可视化。

        泛型类的可视化是一种以图形形式表示泛型类及其与其他类之间关系的方法。这可以帮助人们更好地理解代码的工作原理并更容易地维护和改进它。 

        泛型类的可视化指的是以图形形式展示泛型类的结构、属性和关系。这可以帮助人们更好地理解泛型类的工作原理及其与其他类之间的关系。可视化可以使用诸如UML(统一建模语言)图、代码示例或伪代码等形式来表示。

     在UML图中,您可以表示泛型类及其继承关系。例如,您可以绘制一个方框来表示GenericClass<T>,并在方框内列出其属性和方法。然后,您可以绘制一个类似的方框来表示SubGenericClass<T>,并在其内列出其附加属性和方法。您还可以在UML图中显示这两个类之间的继承关系。

        在代码示例或伪代码中,您可以显示如何创建泛型类及其子类的实例,以及如何访问它们的属性和方法。这将有助于说明泛型类及其继承关系在实际代码中的工作原理。 

(1)用UML图说明泛型类的可视化

         下面是一个简单的UML类图,展示了如何表示一个泛型类及其子类:

+-----------------+        +------------------+
|  GenericClass   |        | SubGenericClass  |
+-----------------+        +------------------+
| - Value: T      |        | - OtherValue: T  |
+-----------------+        +------------------+
| + Value {get,set}|        | + OtherValue {get,set} |
+-----------------+        +------------------+

        在这个UML图中,GenericClass<T>具有一个名为Value的属性,类型 T。 SubGenericClass<T>继承自GenericClass<T>,并添加了一个名为OtherValue的属性,类型也为T。这两个类都定义了相应的属性访问器(get 和 set)。

        UML图并未显示泛型参数T,因为它与具体实现有关,而不是UML图的一部分。UML图主要关注类的结构和关系,而不是实际代码实现。

(2)用实例说明泛型类的可视化

         以下是一个关于如何创建这些类的实例并使用它们的代码示例:

// 泛型类的可视化的代码实现

namespace _128_2
{
    class Program
    {
        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);

            SubGenericClass<int> subGenericClass = new(42, 1337);
            Console.WriteLine("Value: " + subGenericClass.Value);
            Console.WriteLine("OtherValue: " + subGenericClass.OtherValue);
        }
    }

    public class GenericClass<T>(T value)
    {
        public T Value { get; set; } = value;
    }

    public class SubGenericClass<T>(T value, T otherValue) : GenericClass<T>(value)
    {
        public T OtherValue { get; set; } = otherValue;
    }
}
//运行结果:
/*
Value: 42
OtherValue: 1337

*/

        示例创建了一个SubGenericClass<int>的实例,它继承自GenericClass<int>。先使用整数值42和1337来初始化Value和OtherValue属性。然后,再在控制台上打印这两个属性的值。

二、实例1

1.源码

// 通过继承泛型类来分块显示学生的个人信息以及成绩信息。
namespace _128
{
    public partial class Form1 : Form
    {
        private GroupBox? groupBox1;
        private GroupBox? groupBox2;
        private TextBox? textBox6;
        private TextBox? textBox5;
        private TextBox? textBox4;
        private TextBox? textBox3;
        private TextBox? textBox2;
        private TextBox? textBox1;
        private Label? label6;
        private Label? label5;
        private Label? label4;
        private Label? label3;
        private Label? label2;
        private Label? label1;
        private TextBox? textBox9;
        private TextBox? textBox7;
        private Label? label9;
        private TextBox? textBox8;
        private Label? label8;
        private Label? label7;
        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, 25),
                Name = "label1",
                Size = new Size(44, 17),
                TabIndex = 0,
                Text = "编号:"
            };
            // 
            // label2
            // 
            label2 = new Label
            {
                AutoSize = true,
                Location = new Point(178, 25),
                Name = "label2",
                Size = new Size(44, 17),
                TabIndex = 1,
                Text = "姓名:"
            };
            // 
            // label3
            // 
            label3 = new Label
            {
                AutoSize = true,
                Location = new Point(16, 54),
                Name = "label3",
                Size = new Size(44, 17),
                TabIndex = 2,
                Text = "性别:"
            };
            // 
            // label4
            // 
            label4 = new Label
            {
                AutoSize = true,
                Location = new Point(178, 54),
                Name = "label4",
                Size = new Size(44, 17),
                TabIndex = 3,
                Text = "年龄:"
            };
            // 
            // label5
            // 
            label5 = new Label
            {
                AutoSize = true,
                Location = new Point(16, 83),
                Name = "label5",
                Size = new Size(44, 17),
                TabIndex = 4,
                Text = "生日:"
            };
            // 
            // label6
            // 
            label6 = new Label
            {
                AutoSize = true,
                Location = new Point(178, 83),
                Name = "label6",
                Size = new Size(44, 17),
                TabIndex = 5,
                Text = "班级:"
            };
            // 
            // textBox1
            // 

            textBox1 = new TextBox
            {
                Location = new Point(59, 19),
                Name = "textBox1",
                Size = new Size(100, 23),
                TabIndex = 6
            };
            // 
            // textBox2
            // 
            textBox2 = new TextBox
            {
                Location = new Point(218, 19),
                Name = "textBox2",
                Size = new Size(100, 23),
                TabIndex = 7
            };
            // 
            // textBox3
            // 
            textBox3 = new TextBox
            {
                Location = new Point(59, 48),
                Name = "textBox3",
                Size = new Size(100, 23),
                TabIndex = 8
            };
            // 
            // textBox4
            // 
            textBox4 = new TextBox
            {
                Location = new Point(218, 48),
                Name = "textBox4",
                Size = new Size(100, 23),
                TabIndex = 9
            };
            // 
            // textBox5
            // 
            textBox5 = new TextBox
            {
                Location = new Point(59, 77),
                Name = "textBox5",
                Size = new Size(100, 23),
                TabIndex = 10
            };
            // 
            // textBox6
            // 
            textBox6 = new TextBox
            {
                Location = new Point(218, 77),
                Name = "textBox6",
                Size = new Size(100, 23),
                TabIndex = 11
            };
            // 
            // label7
            // 
            label7 = new Label
            {
                AutoSize = true,
                Location = new Point(16, 24),
                Name = "label7",
                Size = new Size(44, 17),
                TabIndex = 0,
                Text = "语文:"
            };
            // 
            // label8
            // 
            label8 = new Label
            {
                AutoSize = true,
                Location = new Point(116, 24),
                Name = "label8",
                Size = new Size(44, 17),
                TabIndex = 1,
                Text = "数学:"
            };
            // 
            // label9
            // 
            label9 = new Label
            {
                AutoSize = true,
                Location = new Point(216, 24),
                Name = "label9",
                Size = new Size(44, 17),
                TabIndex = 2,
                Text = "英语:"
            };
            // 
            // textBox7
            // 
            textBox7 = new TextBox
            {
                Location = new Point(62, 18),
                Name = "textBox7",
                Size = new Size(52, 23),
                TabIndex = 3
            };
            // 
            // textBox8
            // 
            textBox8 = new TextBox
            {
                Location = new Point(162, 18),
                Name = "textBox8",
                Size = new Size(52, 23),
                TabIndex = 4
            };
            // 
            // textBox9
            // 
            textBox9 = new TextBox
            {
                Location = new Point(262, 18),
                Name = "textBox9",
                Size = new Size(52, 23),
                TabIndex = 5
            };
            // 
            // groupBox1
            // 
            groupBox1 = new GroupBox
            {
                Location = new Point(12, 12),
                Name = "groupBox1",
                Size = new Size(333, 109),
                TabIndex = 0,
                TabStop = false,
                Text = "学生信息"
            };
            groupBox1.Controls.Add(textBox6);
            groupBox1.Controls.Add(textBox5);
            groupBox1.Controls.Add(textBox4);
            groupBox1.Controls.Add(textBox3);
            groupBox1.Controls.Add(textBox2);
            groupBox1.Controls.Add(textBox1);
            groupBox1.Controls.Add(label6);
            groupBox1.Controls.Add(label5);
            groupBox1.Controls.Add(label4);
            groupBox1.Controls.Add(label3);
            groupBox1.Controls.Add(label2);
            groupBox1.Controls.Add(label1);
            groupBox1.SuspendLayout();
            // 
            // groupBox2
            // 
            groupBox2 = new GroupBox
            {
                Location = new Point(12, 125),
                Name = "groupBox2",
                Size = new Size(330, 49),
                TabIndex = 0,
                TabStop = false,
                Text = "学生成绩"
            };
            groupBox2.Controls.Add(textBox9);
            groupBox2.Controls.Add(textBox7);
            groupBox2.Controls.Add(label9);
            groupBox2.Controls.Add(textBox8);
            groupBox2.Controls.Add(label8);
            groupBox2.Controls.Add(label7);
            groupBox2.SuspendLayout();
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(267, 180),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 1,
                Text = "获取",
                UseVisualStyleBackColor = true
            };
            button1.Click += Button1_Click;
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(359, 211);
            Controls.Add(button1);
            Controls.Add(groupBox2);
            Controls.Add(groupBox1);
            Name = "Form1";
            Text = "继承泛型类输出学生信息";
            groupBox1.ResumeLayout(false);
            groupBox1.PerformLayout();
            groupBox2.ResumeLayout(false);
            groupBox2.PerformLayout();
        }
        /// <summary>
        /// 通过派生类对象引用学生信息相关的字段,并为其赋值
        /// 实例化派生类对象
        /// </summary>
        private void Button1_Click(object? sender, EventArgs e)
        {
            HStuInfo<object> Execute = new()
            {
                ID = 1,
                Name = "小王",
                Sex = "男",
                Age = 16,
                Birthday = Convert.ToDateTime("1993-11-29"),
                Grade = "三年五班",
                Chinese = 145,
                Math = 140,
                English = 137
            };
            //将学生信息显示在TextBox文本框中
            textBox1!.Text = Execute.ID.ToString();
            textBox2!.Text = Execute.Name.ToString();
            textBox3!.Text = Execute.Sex.ToString();
            textBox4!.Text = Execute.Age.ToString();
            textBox5!.Text = Execute.Birthday.ToString();
            textBox6!.Text = Execute.Grade.ToString();
            textBox7!.Text = Execute.Chinese.ToString();
            textBox8!.Text = Execute.Math.ToString();
            textBox9!.Text = Execute.English.ToString();
        }
        /// <summary>
        /// 学生信息泛型类
        /// </summary>
        class BStuInfo<T>
        {
            public T? ID;       //声明学生编号字段 
            public T? Name;     //声明姓名字段 
            public T? Sex;      //声明性别字段 
            public T? Age;      //声明年龄字段 
            public T? Birthday; //声明生日字段 
            public T? Grade;    //声明班级字段
        }
        /// <summary>
        /// 学生成绩泛型类
        /// 继承自BStuInfo泛型类
        /// </summary>
        class HStuInfo<T> : BStuInfo<T>
        {
            public T? Chinese; //声明语文成绩字段
            public T? Math;    //声明数学成绩字段
            public T? English; //声明英语成绩字段
        }
    }
}

2.生成效果

 

三、实例2

// 泛型类的继承

namespace _128_1
{
    class Program
    {
        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);

            SubGenericClass<string> subGenericClass = new("Hello, World!", "Hello, again!");

            Console.WriteLine(subGenericClass.GetValue());
            Console.WriteLine(subGenericClass.GetOtherValue());
            Console.WriteLine("**************");
            subGenericClass.SetValue("New value");
            subGenericClass.SetOtherValue("New other value");

            Console.WriteLine(subGenericClass.GetValue());
            Console.WriteLine(subGenericClass.GetOtherValue());
        }
    }

    public class GenericClass<T>(T value)
    {
        private T Value = value;

        public T GetValue()
        {
            return Value;
        }

        public void SetValue(T value)
        {
            Value = value;
        }
    }

    public class SubGenericClass<U>(U value, U otherValue) : GenericClass<U>(value)
    {
        private U OtherValue = otherValue;

        public U GetOtherValue()
        {
            return OtherValue;
        }

        public void SetOtherValue(U otherValue)
        {
            OtherValue = otherValue;
        }
    }
}
//运行结果:
/*
Hello, World!
Hello, again!
**************
New value
New other value

*/

        在这个例子中,GenericClass是一个带有类型参数T的泛型类。SubGenericClass继承了GenericClass并具有自己的类型参数U。SubGenericClass可以使用 GenericClass的Value字段和方法,同时还添加了它自己的OtherValue字段和方法。

        示例创建了一个SubGenericClass<string>的实例,将"Hello, World!"作为Value,将"Hello, again!"作为OtherValue。然后我们访问了GetValue()和GetOtherValue()方法以显示值。之后,我们使用SetValue("New value")和SetOtherValue("New other value")方法更新值,并再次使用GetValue()和GetOtherValue()方法显示更新后的值。

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

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

相关文章

mac 安装H3C iNode + accessClient mac版

一、下载安装 官网下载地址 https://www.h3c.com/cn/Service/Document_Software/Software_Download/IP_Management/ 可以使用文末参考博文中的账号 yx800 密码 01230123登录下载 选择版本 下载 下载 H3C_iNode_PC_7.3_E0626.zip 文件后&#xff0c;解压下载到的PC端压缩包…

9.vue学习笔记(组件传递Props校验+组件事件-组件传递数据+组件事件-配合“v-model”使用)

文章目录 1.组件传递Props校验1.1.默认值1.2.必选项1.3.注意事项&#xff1a;props 是只读的 2.组件事件-组件传递数据2.1.温馨提示&#xff1a;组件之间传递数据的方案 3.组件事件-配合“v-model”使用 1.组件传递Props校验 Vue组件可以更细致地声明对传入的 props 的校验要求…

jenkins远程触发构建报:Error 403 No valid crumb was included in the request

最近在跨jenkins触发构建的时候发现不能触发相应的项目&#xff0c;报如下图错误 解决方案&#xff1a; 1、安装Build Authorization Token Root Plugin插件 安装完成后去配置API Token&#xff0c;用户列表&#xff0c;配置用户的API Token&#xff0c;生成后记得保存 2、项…

Linux:Jenkins:GitLab+Maven+Jenkins的部署——离线包rpm版

Linux&#xff1a;Jenkins&#xff1a;GitLabMavenJenkins的部署&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136157018?spm1001.2014.3001.5501这个是原版文章&#xff0c;均是使用的在线情况&#xff0c;但是不排除会有离线部署&am…

Java Web(七)__Tomcat(一)

JavaWeb 服务器 介绍 为什么需要&#xff1f; Web服务器是一个应用程序&#xff08;软件&#xff09;&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序员不必直接对协议进行操作&#xff0c;让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。Web服…

目标检测7-DETR算法剖析与实现

文章目录 端到端目标检测框架DETR背景介绍模型结构模块解析数据模型结构 动手实现DETR 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 端到端目标检测框架DETR 背景介绍 DETR是Facebook AI的Nicolas Carion等于2020年05月提交的论文中提…

stm32——hal库学习笔记(定时器)

这里写目录标题 一、定时器概述&#xff08;了解&#xff09;1.1&#xff0c;软件定时原理1.2&#xff0c;定时器定时原理1.3&#xff0c;STM32定时器分类1.4&#xff0c;STM32定时器特性表1.5&#xff0c;STM32基本、通用、高级定时器的功能整体区别 二、基本定时器&#xff0…

消息队列-RabbitMQ:延迟队列、rabbitmq 插件方式实现延迟队列、整合SpringBoot

十六、延迟队列 1、延迟队列概念 延时队列内部是有序的&#xff0c;最重要的特性就体现在它的延时属性上&#xff0c;延时队列中的元素是希望在指定时间到了以后或之前取出和处理&#xff0c;简单来说&#xff0c;延时队列就是用来存放需要在指定时间被处理的元素的队列。 延…

揭秘离子交换工艺:解决地下水氟超标问题的绿色高效方案

在水处理领域&#xff0c;面对地下水氟化物超标的挑战&#xff0c;各类除氟工艺如活性氧化铝吸附法、电渗析法、反渗透法等各显其能。然而&#xff0c;在综合考虑处理效果、运行成本及环保效益后&#xff0c;离子交换工艺以其独特的技术优势和可持续性脱颖而出&#xff0c;成为…

Python环境下基于门控双注意力机制的滚动轴承剩余使用寿命RUL预测(Tensorflow模块)

机械设备的寿命是其从开始工作持续运行直至故障出现的整个时间段&#xff0c;以滚动轴承为例&#xff0c;其寿命为开始转动直到滚动体或是内外圈等元件出现首次出现故障前。目前主流的滚动轴承RUL预测分类方法包含两种&#xff1a;一是基于物理模型的RUL预测方法&#xff0c;二…

互联网高科技公司领导AI工业化,MatrixGo加速人工智能落地

作者&#xff1a;吴宁川 AI&#xff08;人工智能&#xff09;工业化与AI工程化正在引领人工智能的大趋势。AI工程化主要从企业CIO角度&#xff0c;着眼于在企业生产环境中规模化落地AI应用的工程化举措&#xff1b;而AI工业化则从AI供应商的角度&#xff0c;着眼于以规模化方式…

C++面试宝典第31题:有效的数独

题目 判断一个9 x 9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 1、数字1-9在每一行只能出现一次。 2、数字1-9在每一列只能出现一次。 3、数字1-9在每一个以粗实线分隔的3 x 3宫内只能出现一次。 下图是一个部分填充的有效的数独,数独部分空格内已…

FITC Palmitate Conjugate,FITC-棕榈酸酯缀合物,可以用标准 FITC 滤光片组进行成像

FITC Palmitate Conjugate&#xff0c;FITC-棕榈酸酯缀合物&#xff0c;可以用标准 FITC 滤光片组进行成像 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;FITC Palmitate Conjugate&#xff0c;FITC-棕榈酸酯缀合物&#xff0c;FITC 棕榈酸酯缀合物&#xff0c;F…

如何将cocos2d-x js打包部署到ios上 Mac M1系统

项目环境 cocos2d-x 3.13 xcode 12 mac m1 big sur 先找到你的项目 使用xcode软件打开上面这个文件 打开后应该是这个样子 执行编译运行就好了 可能会碰到的错误 在xcode11版本以上都会有这个错误&#xff0c;这是因为iOS11废弃了system。 将上面代码修改为 #if (CC_TARGE…

基于springboot+vue的高校学科竞赛系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

详细描述一下CrossOver2024版本的用途和作用?

当然可以。CrossOver 是一款由 CODE WEAVERS 公司开发的软件&#xff0c;其主要目标是在 macOS 和 Linux 系统上实现与 Windows 应用程序的兼容性。它不同于传统的虚拟机&#xff0c;如 Parallels 或 VMware&#xff0c;因为它并不在 macOS 上创建一个完整的 Windows 环境。相反…

机房预约系统(个人学习笔记黑马学习)

1、机房预约系统需求 1.1系统简介 学校现有几个规格不同的机房&#xff0c;由于使用时经常出现“撞车“现象,现开发一套机房预约系统&#xff0c;解决这一问题。 1.2身份简介 分别有三种身份使用该程序 学生代表:申请使用机房教师:审核学生的预约申请管理员:给学生、教师创建账…

HarmonyOS开发技术全面分析

系统定义 HarmonyOS 是一款 “ 面向未来 ” 、面向全场景&#xff08;移动办公、运动健康、社交通信、媒体娱乐等&#xff09;的分布式操作系统。在传统的单设备系统能力的基础上&#xff0c;HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够…

网络安全“三保一评”深度解析

“没有网络安全就没有国家安全”。近几年&#xff0c;我国法律法规陆续发布实施&#xff0c;为承载我国国计民生的重要网络信息系统的安全提供了法律保障&#xff0c;正在实施的“3保1评”为我国重要网络信息系统的安全构筑了四道防线。 什么是“3保1评”&#xff1f; 等保、分…

LVGL8.1在Windows显示图片

1、将这些宏的值改成1&#xff0c;以便支持这些格式&#xff1a; 2、 这两个地方&#xff1a; LV_USE_FS_WIN32 设置符号&#xff0c;大小写字母、“\”、“”等符号都可以。 LV_FS_WIN32_PATH 为一个目录&#xff0c;图片放入此目录。 3、载入图片&#xff1a; “M:color.pn…