c#多态性的应用

设计一个电脑游戏,游戏中有猪、牛、兔子、青蛙、鸭子等动物,这些动 物都继承于Vertebrata 类(脊椎动物类),Vertebrata类有一个抽象方法Display(),每个动 物都从Vertebrata 类那里继承并重写了Display()方法,用来把动物本身画在屏幕上。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DuTai
{
    internal class Program
    {
        static void Main(string[] args)
        {
              // 声明一个基类(Vertebrata 类)的引用符数组
       Vertebrata[] animals = new Vertebrata[5];
    // 让每个引用符指向一个派生类对象
            animals[0] = new Pig();
            animals[1] = new Rabbit();
            animals[2] = new Cattle();
            animals[3] = new Frog();
            animals[4] = new Duck();
    //通用处理
    foreach (Vertebrata someone in animals)
            {
                someone.Display();   //不论对象是什么类型,都使用相同的语句处理           
            }
    Console.ReadKey();
        }
       
    }


    //脊椎动物总类 
    abstract class Vertebrata
    {
        
        public abstract void Display();//抽象方法:绘图
        //其他成员
        //......; 
        //......; 
    }
    //哺乳动物(副总)类 
    class Mammal : Vertebrata
    {

        public override void Display()        //重写方法:绘图
        {
        }
    }

    //鸟类(副总类) ,继承于脊柱动物(总)类
    class Bird : Vertebrata
    {
        //重写方法:绘图 
        public override void Display()
        {
        }
    }

    //两栖动物(副总类),继承于脊柱动物(总)类
    class Amphibian : Vertebrata
    {
        //重写方法:绘图 
        public override void Display()
        {
        }
    }

    //猪类 ,继承于哺乳动物(副总)类 
    class Pig : Mammal
    {
       
        public override void Display()// //重写方法:绘图 
        {
            Console.WriteLine(@"  ╭︿︿☆╮ oοΟ 
                                  {/ . .\}  
                                   ( (oo) )    
                                    ︶︶︶  
                                 我是笨猪我怕谁  ");
        }

    }
    //兔子类 ,继承于哺乳动物(副总)类
    class Rabbit : Mammal
    {
        //重写方法:绘图 
        public override void Display()
        {
            Console.WriteLine(@"  (\(\  /)/)  
                                  (-.-)(-.-) 
                                 小兔子乖乖");
        }
    }

    //牛类 ,继承于哺乳动物(副总)类
    class Cattle : Mammal
    { //重写方法:绘图 
        public override void Display()
        {
            Console.WriteLine(@"   (___) 
                                   (o o)____( 
                                    @@ `     \          
                                     \ ____, / 
                                     //    //  
                                    ^^    ^^    
                                   勤劳的牛");
        }
    }
    //青蛙类 ,继承于两栖动物(副总类)
    class Frog : Amphibian
    {
        //重写方法:绘图 
        public override void Display()
        {
            Console.WriteLine(@"   @..@ 
                                  (\--/) 
                                  (.>__<.) 
                                  ^^^ ^^^ 
                                   青蛙王子");
        }
    }
    //鸭子类 ,继承于鸟类(副总类)
    class Duck : Bird
    {
        //重写方法:绘图 
        public override void Display()
        {
            Console.WriteLine(@"        __ 
                                      >(' ) 
                                        )/ 
                                       /( 
                                      / `----/ 
                                      \ ~=- / 
                                  ~^~^~^~^~^~^~^ 
                                 春江水暖鸭先知");
        }
    }

}

启动程序:

程序中的foreach语句是 通用部分,Vertebrata 型引用符someone依次指向数组animals中的 对象,不管对象是哪种动物,都使用语句“someone.Display()”进 行绘图。系统根据 someone 指向的动物类型调用对应版本的 Display()方法。当添加一种新的动物时,只需要往数组里添加一个 对象,程序的通用部分不需要修改。 

继承和多态性是开发复杂软件的关键技术,特别适合于分层软 件系统。操作系统要处理各种各样的存储介质,比如硬盘、软盘、 U盘等等,这些硬件的具体工作原理显然是不同的,但它们都有读 和写两个操作。操作系统可以设计一个抽象基类,提供 Read()和 Write()两个抽象函数,各种硬件的驱动程序被编写为该抽象基类的 派生类,具体实现Read()和Write()操作。操作系统只需通过基类的 引用符调用Read()和Write()函数即可,不用关心在读取哪种存储介 质,更不用关心它们是怎么实现的。当有新设备产生以后,设备生 产厂家只需编写继承于抽象基类的驱动程序即可,不用更改操作系 统本身。

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

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

相关文章

Naive RAG 、Advanced RAG 和 Modular RAG 简介

简介&#xff1a; RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统是一种结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的机制&#xff0c;用于提高大型语言模型&#xff08;LLMs&#xff09;在特定任务上的表现。随…

【Vue】Vue指令与生命周期以及组件化编码

目录 常用内置指令v-text与v-htmlv-text : 更新元素的 textContentv-html : 更新元素的 innerHTML注意&#xff1a;v-html有安全性问题&#xff01;&#xff01;&#xff01;&#xff01; v-once与v-prev-oncev-pre ref与v-cloakrefv-cloak 自定义指令案例定义语法配置对象中常…

Visual Studio Community : The prerelease has expired

最近使用旧版的离线安装包安装社区版Visual Studio2022&#xff08;Visual Studio Community 2022&#xff09;&#xff0c;安装完成后显示&#xff1a;The prerelease has expired。使用自己的微软账号登录还是一样的情况&#xff0c;只能强制退出。经过摸索后发现了一个解决方…

选择法(数值排序)(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明排序函数sort; void sort(int a[], int n);int main() {//初始化变量值&#xff1b;int i, a[10];//填充数组&#xff1b;printf("请输入10个整数\n&…

OSI 网络互联参考模型的思考与总结

前言&#xff1a; 最近一个项目用到了SmartLink配网&#xff0c; 涉及到了UDP的广播和组播&#xff0c;所以就想着回顾总结了下ISO参考模型的相关知识。 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连。 一般都叫OSI参考模型&#xff0c;…

【Linux】自动化编译工具——make/makefile(超细图例详解!!)

目录 一、前言 二、make / Makefile背景介绍 &#x1f95d;Makefile是干什么的&#xff1f; &#x1f347;make又是什么&#xff1f; 三、demo实现【见见猪跑&#x1f416;】 四、依赖关系与依赖方法 1、概念理清 2、感性理解【父与子&#x1f468;】 3、深层理解【程序…

30-10y国债利差反转的必要条件

国君宏观表示&#xff0c;30-10y期限利差定价本质上是私人部门主动加杠杆的预期&#xff0c;央行购债与资本市场的正向反馈是可以期待的一种场景&#xff0c;而企业部门的被动加杠杆须以可持续的需求动能与盈利预期作为前提。 要点&#xff1a; 期限利差的本质&#xff1a;对长…

C++:编程领域的全能王者

在编程语言的海洋中&#xff0c;C以其全面而强大的功能&#xff0c;犹如一位全能王者&#xff0c;屹立不倒。它不仅在科技领域有着广泛的应用&#xff0c;更在推动社会进步、促进人类创新方面发挥着至关重要的作用。 一、C&#xff1a;编程界的璀璨明星 C自诞生以来&#xff…

时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)

目录 引言 LSTM的预测效果图 LSTM机制 了解LSTM的结构 忘记门 输入门 输出门 LSTM的变体 只有忘记门的LSTM单元 独立循环(IndRNN)单元 双向RNN结构(LSTM) 运行代码 代码讲解 引言 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种常用的循环神经网络&a…

数据库的存储过程、函数与触发器

使用下面的场景来引入 1.创建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

Python爬虫——如何使用urllib的HTTP基本库

怎样通过 urllib库 发送 HTTP 请求&#xff1f; urllib库主要由四个模块组成: urllib.request 打开和读取 URLurllib.error 包含 urllib.request 抛出的异常urllib.parse 用于解析 URLurllib.robotparser 用于解析 robots.txt 文件 1. 使用urllib.parse解析URL 使用urlparse(…

C++:编程世界的永恒之石

在编程的广袤领域中&#xff0c;C犹如一块永恒的基石&#xff0c;历经岁月的洗礼&#xff0c;依旧坚固而璀璨。它的深厚底蕴、强大功能和广泛的应用领域&#xff0c;使其成为无数程序员心中的信仰与追求。 一、C&#xff1a;历史与传承的交汇点 C的历史可追溯到上世纪80年代&…

Spring自定义配置属性类

以一个minio的配置类为例 首先&#xff0c;由于minio模块被很多微服务需要&#xff0c;因此封装了一个starter&#xff0c;当背的微服务需要的时候就进行引入。 以下是starter模块的结构图 一、spring.factories文件 org.springframework.boot.autoconfigure.EnableAutoConf…

2.1.2 事件驱动reactor的原理与实现

LINUX 精通 2 day14 20240513 day15 20240514 算法刷题&#xff1a;2维前缀和&#xff0c;一二维差分 耗时 135min 习题课 4h 课程补20240425 耗时&#xff1a;4h 课程链接地址 回顾 怎么学0voice课网络io——一请求一线程&#xff0c;一个client一个连接再accpet分配io f…

每日两题 / 437. 路径总和 III 105. 从前序与中序遍历序列构造二叉树(LeetCode热题100)

437. 路径总和 III - 力扣&#xff08;LeetCode&#xff09; 前序遍历时&#xff0c;维护当前路径&#xff08;根节点开始&#xff09;的路径和&#xff0c;同时记录路径上每个节点的路径和 假设当前路径和为cur&#xff0c;那么ans 路径和(cur - target)的出现次数 /*** D…

C语言:指针(3)

1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; 本质是把字符串 hello bit. ⾸字符的地址放到了pstr中。上⾯代码的意思是把⼀个常量字符串的⾸字符 h 的地址存放到指针变量 pstr 中。 2. 数组指针变量 2.1 数组指针变量是什么&#xff1f; 答案…

2024年高考倒计时精品网页

2024年高考倒计时精品网页 前言效果图部分代码领取源码下期更新预报 前言 随着季风轻轻掠过&#xff0c;岁月如梭&#xff0c;再次迎来了这个属于青春与梦想交汇的时刻——高考。这是一场知识的较量&#xff0c;更是一次意志的考验。在这最后的冲刺阶段&#xff0c;每一刻都显…

注意力机制篇 | YOLOv8改进之在C2f模块引入反向残差注意力模块iRMB | CVPR 2023

前言:Hello大家好,我是小哥谈。反向残差注意力模块iRMB是一种用于图像分类和目标检测的深度学习模块。它结合了反向残差和注意力机制的优点,能够有效地提高模型的性能。在iRMB中,反向残差指的是将原始的残差块进行反转,即将卷积操作和批量归一化操作放在了后面。这样做的好…

第 5 篇 : 多节点Netty服务端(可扩展)

说明 前面消息互发以及广播都是单机就可以完成测试, 但实际场景中客户端的连接数量很大, 那就需要有一定数量的服务端去支撑, 所以准备虚拟机测试。 1. 虚拟机准备 1.1 准备1个1核1G的虚拟机(160), 配置java环境, 安装redis和minio 1.2 准备6个1核1G的空虚拟机(161到166), …

【opencv】图像拼接实验

实验环境&#xff1a;anaconda、jupyter notebook 实验用到的包&#xff1a;opencv、matplotlib、numpy 注&#xff1a;opencv在3.4.2之后sift就不是免费的了 我用的是3.4.1.15版本 实验使用到的图片 一、sift函数获取特征值 读入图片 book cv2.imread(book.png, cv2.IMRE…