首页 > 编程语言 >.net程序设计1

.net程序设计1

时间:2024-11-05 20:46:30浏览次数:3  
标签:string int class 派生类 程序设计 net 方法 public

using System;

namespace PersonApp
{
    // Person 类定义
    public class Person
    {
        // 数据成员
        private string name;
        private string gender;
        private int yearOfBirth;

        // 属性
        public string MyName
        {
            get { return name; }
            set { name = value; }
        }

        public string MyGender
        {
            get { return gender; }
            set { gender = value; }
        }

        public int MyYearOfBirth
        {
            get { return yearOfBirth; }
            set { yearOfBirth = value; }
        }

        // 只读属性,计算年龄
        public int Age
        {
            get
            {
                int currentYear = DateTime.Now.Year;
                return currentYear - yearOfBirth;
            }
        }

        // 构造函数,初始化数据成员
        public Person(string name, string gender, int yearOfBirth)
        {
            this.name = name;
            this.gender = gender;
            this.yearOfBirth = yearOfBirth;
        }

        // 方法:格式化输出姓名、称谓和年龄
        public virtual void Print()
        {
            string title = (gender.ToLower() == "男") ? "先生" : "女士";
            Console.WriteLine($"您好, {name}, {title}! 您今年{Age}岁。");
        }

    }
    public class Teacher : Person
    {
        // 数据成员
        private string tId;       // 工号
        private int tStartYear;   // 从教年份

        // 属性
        public string MyTId
        {
            get { return tId; }
            set { tId = value; }
        }

        public int MyTStartYear
        {
            get { return tStartYear; }
            set { tStartYear = value; }
        }

        // 计算从教年限的属性
        public int TeachingYears
        {
            get
            {
                int currentYear = DateTime.Now.Year;
                return currentYear - tStartYear;  // 计算从教年限
            }
        }

        // 构造函数
        public Teacher(string name, string gender, int yearOfBirth, string tId, int tStartYear)
            : base(name, gender, yearOfBirth) // 调用基类构造函数
        {
            this.tId = tId;
            this.tStartYear = tStartYear;
        }

        // 重载 Print 方法
        public override void Print()
        {
            base.Print();  // 调用基类的Print方法输出基本信息
            Console.WriteLine($"您已有{TeachingYears}年教龄,教师工号为:{tId}。");
        }
    }

    // 主程序
    class Program
    {
        static void Main(string[] args)
        {
            // 获取用户输入
            Console.WriteLine("请输入姓名:");
            string name = Console.ReadLine();

            Console.WriteLine("请输入性别(男或女):");
            string gender = Console.ReadLine();

            Console.WriteLine("请输入出生年份: ");
            int yearOfBirth;

            while (!int.TryParse(Console.ReadLine(), out yearOfBirth) || yearOfBirth <= 0)
            {
                Console.WriteLine("请输入有效的出生年份:");
            }                     

            // 创建 Teacher 对象(可以根据需要输入教工号和从教年份)
            Console.WriteLine("请输入教师工号:");
            string tId = Console.ReadLine();

            Console.WriteLine("请输入从教年份:");
            int tStartYear;

            while (!int.TryParse(Console.ReadLine(), out tStartYear) || tStartYear <= 0)
            {
                Console.WriteLine("请输入有效的从教年份:");
            }

            Teacher teacher = new Teacher(name, gender, yearOfBirth, tId, tStartYear);

            // 打印输出教师信息
            Console.WriteLine("【教师信息】");
            teacher.Print();

            // 等待用户按任意键退出程序
            Console.WriteLine("\n按任意键退出...");
            Console.ReadKey();  // 等待用户按任意键
        }
    }
}

在 C# 中,虚方法virtual)和抽象方法abstract)都是用于在基类中定义方法的特殊类型,它们允许在派生类中重写这些方法,但它们在用法和行为上有一些重要区别:

1. 虚方法(virtual

  • 定义: 在基类中声明的方法可以被派生类重写(override)。虚方法具有一个实现,但派生类可以选择覆盖它。

  • 行为: 虚方法有默认的实现。派生类可以选择是否重写这个方法。如果派生类没有重写该方法,那么基类的实现就会被调用。

  • 关键字: 使用 virtual 关键字来标记该方法为虚方法。

  • 示例:

    class BaseClass
    {
        public virtual void Display()
        {
            Console.WriteLine("Base class display.");
        }
    }
    
    class DerivedClass : BaseClass
    {
        public override void Display()
        {
            Console.WriteLine("Derived class display.");
        }
    }
    
    // 使用虚方法
    BaseClass obj = new DerivedClass();
    obj.Display();  // 输出: Derived class display.
    
  • 特点:

    • 可以有一个默认实现。
    • 可以被派生类覆盖(override)。
    • 如果派生类没有重写该方法,基类的实现会被调用。

2. 抽象方法(abstract

  • 定义: 抽象方法是没有实现的方法,它只是一个声明,表示必须在派生类中实现具体的逻辑。抽象方法只能在抽象类中声明。

  • 行为: 抽象方法没有任何实现,派生类必须提供具体的实现。如果派生类没有重写该方法,编译时会报错。

  • 关键字: 使用 abstract 关键字来标记该方法为抽象方法。

  • 示例:

    abstract class BaseClass
    {
        public abstract void Display();  // 抽象方法,没有实现
    }
    
    class DerivedClass : BaseClass
    {
        public override void Display()
        {
            Console.WriteLine("Derived class display.");
        }
    }
    
    // 使用抽象方法
    BaseClass obj = new DerivedClass();
    obj.Display();  // 输出: Derived class display.
    
  • 特点:

    • 没有方法体,只有声明。
    • 必须在派生类中提供实现。
    • 抽象方法只能在抽象类中声明,抽象类不能直接实例化。
    • 如果派生类没有实现抽象方法,编译器会报错。

总结:虚方法 vs 抽象方法

特性 虚方法 (virtual) 抽象方法 (abstract)
实现 可以有实现,派生类可以选择覆盖它 没有实现,派生类必须提供实现
类要求 可以在普通类中声明 必须在抽象类中声明
派生类要求 派生类可以选择覆盖(override 派生类必须覆盖(override),否则会报错
是否可以实例化 可以实例化基类(如果没有抽象成员) 不能实例化抽象类

使用场景:

  • 虚方法: 适用于基类希望提供默认实现,但又允许派生类根据需要重写该实现的情况。
  • 抽象方法: 适用于基类定义了一个协议,要求所有派生类必须提供具体实现的场景。

简而言之,虚方法提供默认实现,而抽象方法仅仅提供方法签名,要求派生类必须实现。

标签:string,int,class,派生类,程序设计,net,方法,public
From: https://www.cnblogs.com/zzzxyy/p/18528794

相关文章

  • .net程序设计0
    利用VS2019中控制台应用应用完成usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespacetry11{classProgram{staticvoidMain(string[]args){}}}......
  • 2款使用.NET开发的数据库系统
    前言今天大姚给大家分享2款使用.NET开发且开源的数据库系统。GarnetGarnet是一款由微软研究院基于.NET开源的高性能、跨平台的分布式缓存存储数据库,该项目提供强大的性能(吞吐量和延迟)、可扩展性、存储、恢复、集群分片、密钥迁移和复制功能。并且无需做任何修改可以与现有的Re......
  • Net 9中LINQ新增特性
    在.NET9中,LINQ引入了一些新的特性和增强功能,以下是主要的新特性列表:1.AsQueryable()扩展方法对List<T>支持在.NET9中,List<T>类型现在支持调用AsQueryable()方法,将List<T>转换为IQueryable<T>,使得可以执行更复杂的LINQ查询,尤其是在与IQueryable数据源......
  • Kubernetes架构及核心组件
    一、基本架构Kubernetes集群可以被看作是一个工厂,而各个组件则是这个工厂里的不同部门:KubernetesAPI服务器:就像是这个工厂的总经理,负责接收所有的请求并将它们分配给相应的部门进行处理。etcd:就像是这个工厂的记事本,负责记录所有的配置信息和状态信息,以便其他组件可......
  • 【计算机毕设选题推荐】基于springboot程序设计基础课程辅助教学系统的设计与实现 【
    ✍✍计算机编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java实战|SpringBoot/SSMPython实战项目|Django微信小程......
  • 5分钟上手 Kubernetes:精简实用的 Kubectl 命令速查宝典!
    对于刚开始学习Kubernetes的人来说,理解和掌握kubectl命令是入门的第一步。kubectl是Kubernetes的命令行工具,用于管理Kubernetes集群中的资源。在这篇文章中,我们将总结一些最常用的kubectl命令,通过简明的介绍和示例,让你在5分钟内快速上手Kubernetes,优雅地开始使用K8......
  • 如何使用nssm将asp.net core/.net6/.net8的webapi项目、mvc项目、控制台项目等注册为w
    nssm工具可以将asp.netFramework、asp.netcore、net6、.net8、.net10及后续本的的webapi项目、mvc项目、控制台项目、winform项、WPF项目等注册为windows服务。不仅限于上面这些,nssm可以将所有windows可执行文件注册为windows服务。下面,使用nssm将asp.net8的webapi项目注册为w......
  • EasyQBlog .NET 8 + Q-Blog 2.0博客模板 + easyweb iframe后台模板 开发的个人博客
    EasyAdmin介绍.NET8+Q-Blog2.0博客模板+easywebiframe后台模板开发的个人博客演示地址:https://www.baocaige.top暂不开源,需要滴滴!!!项目截图 ......
  • CentOS 7 下安装部署.NET Core多版本环境
    文章目录一、前言1、什么时候需要配置多环境?2、环境信息二、部署过程1、SDK下载&安装基础依赖2、配置环境入口三、问题一、前言1、什么时候需要配置多环境?.NETCore作为.NET的开源版本,可以说是非常拥抱开源了,更新的力度也非常给力。却也从开源世界学了点坏东西,那......
  • dotNet 整合 Microsoft.Extensions.DependencyInjection 利用反射实现依赖批量注入
    前言框架.net8.0Microsoft.Extensions.DependencyInjection8.0创建三个类库项目ConfigServicesLogServicesMailServices创建一个控制台项目ConsoleAppMailConfigServicesnamespaceConfigServices.IService{publicinterfaceIConfigService{......