unity C#中的封装、继承和多态简单易懂的经典实例

news2024/11/26 11:36:46

文章目录

      • 封装 (Encapsulation)
      • 继承 (Inheritance)
      • 多态 (Polymorphism)

C#中的封装、继承和多态是面向对象编程(OOP)的三大核心特性。下面分别对这三个概念进行深入解释,并通过实例来说明它们在实际开发中的应用。

封装 (Encapsulation)

实例1:

public class BankAccount
{
    private decimal balance; // 私有变量,封装内部状态

    public BankAccount(decimal initialBalance)
    {
        this.balance = initialBalance;
    }

    // 公共方法,提供访问私有数据的受控方式
    public decimal GetBalance()
    {
        return balance;
    }

    public void Deposit(decimal amount)
    {
        if (amount > 0)
            balance += amount;
    }

    public void Withdraw(decimal amount)
    {
        if (amount > 0 && amount <= balance)
            balance -= amount;
    }
}

在这个例子中,BankAccount 类封装了账户余额(balance),外部不能直接修改它,只能通过 DepositWithdraw 方法来进行操作,这样保证了数据的安全性和完整性。

继承 (Inheritance)

实例2:

public class Animal
{
    public string Name { get; set; }
    public int Age { get; set; }

    public virtual void Eat()
    {
        Console.WriteLine("动物正在吃东西...");
    }
}

public class Dog : Animal
{
    public bool IsTrained { get; set; }

    // 重写父类方法以提供更具体的行为
    public override void Eat()
    {
        Console.WriteLine("狗狗正在吃狗粮...");
    }

    public void Bark()
    {
        Console.WriteLine("狗狗在叫!");
    }
}

// 使用示例:
Dog myDog = new Dog() { Name = "小黑", Age = 3, IsTrained = true };
myDog.Eat(); // 输出 "狗狗正在吃狗粮..."
myDog.Bark(); // 输出 "狗狗在叫!"

在这里,Dog 类从 Animal 类继承而来,继承了其属性并重写了 Eat 方法,同时添加了一个独有的 Bark 方法,体现了“继承”带来的代码复用和扩展性。

多态 (Polymorphism)

实例3:

public abstract class Shape
{
    public abstract double Area();
}

public class Circle : Shape
{
    public double Radius { get; set; }

    public override double Area()
    {
        return Math.PI * Radius * Radius;
    }
}

public class Square : Shape
{
    public double Side { get; set; }

    public override double Area()
    {
        return Side * Side;
    }
}

public static class Program
{
    public static void DisplayArea(Shape[] shapes)
    {
        foreach (var shape in shapes)
        {
            Console.WriteLine($"形状的面积为: {shape.Area()}");
        }
    }

    public static void Main()
    {
        var circle = new Circle() { Radius = 5 };
        var square = new Square() { Side = 10 };

        Shape[] shapes = { circle, square };
        DisplayArea(shapes); // 输出不同形状的具体面积
    }
}

此例中,CircleSquare 都是从抽象基类 Shape 派生出来的,它们都实现了 Area 抽象方法。在 DisplayArea 函数中,通过 Shape 类型的数组可以容纳不同类型的形状对象,这是多态性的体现,即同一接口(Area 方法)下不同的实现。

实例4(接口实现多态):

public interface IRunnable
{
    void Run();
}

public class Car : IRunnable
{
    public void Run()
    {
        Console.WriteLine("汽车正在行驶...");
    }
}

public class Airplane : IRunnable
{
    public void Run()
    {
        Console.WriteLine("飞机正在飞行...");
    }
}

public static class Program
{
    public static void MakeRun(IRunnable vehicle)
    {
        vehicle.Run();
    }

    public static void Main()
    {
        Car car = new Car();
        Airplane airplane = new Airplane();

        MakeRun(car); // 输出 "汽车正在行驶..."
        MakeRun(airplane); // 输出 "飞机正在飞行..."
    }
}

这里展示了通过接口实现多态的例子。IRunnable 接口定义了一个通用行为 Run,尽管 CarAirplane 的运行方式完全不同,但都可以实现这个接口,从而使得 MakeRun 方法能够处理任何实现了 IRunnable 的对象。

实例5(虚方法与动态绑定):

public class BaseClass
{
    public virtual void ShowMessage()
    {
        Console.WriteLine("这是基础类的消息");
    }
}

public class DerivedClass : BaseClass
{
    public override void ShowMessage()
    {
        Console.WriteLine("这是派生类的消息");
    }
}

public static class Program
{
    public static void DisplayMessage(BaseClass obj)
    {
        obj.ShowMessage();
    }

    public static void Main()
    {
        BaseClass baseObj = new BaseClass();
        DerivedClass derivedObj = new DerivedClass();

        DisplayMessage(baseObj); // 输出 "这是基础类的消息"
        DisplayMessage(derivedObj); // 输出 "这是派生类的消息",尽管传入的是基类引用
    }
}

这个例子展示了动态多态性,即使通过基类类型引用调用虚方法时,也会根据实际的对象类型调用对应的重写方法。这就是多态的一个重要方面,称为运行时多态或动态绑定。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

11. Springboot集成Dubbo3(二)示例demo

目录 1、前言 2、注册中心 3、快速开始 3.1、添加dubbo3依赖 3.2、dubbo3-api ​编辑 3.3、dubbo3-server 3.3.1、添加依赖 3.3.2、实现IUserService 3.3.3、添加配置文件application.properties 3.3.4、修改Application启动类 3.3.5、出错解决 3.4、dubbo3-porta…

世界顶级名校计算机专业,都在用哪些书当教材?

前言 在当今信息化、数字化时代&#xff0c;计算机科学已成为全球最为热门和重要的学科之一。世界顶级名校的计算机专业&#xff0c;更是培养未来行业领袖和创新人才的重要基地。那么&#xff0c;这些名校的计算机专业究竟使用哪些教材呢&#xff1f;这些教材又具有哪些特色和…

智能化机械生产引擎:亿发制造ERP系统助帮助工厂真正把控车间管理

工厂的制造管理过程以车间管理为核心&#xff0c;而车间管理涉及到生产的下达、派工、汇报等复杂流程&#xff0c;几乎包含了生产的全过程。这种繁琐性使得车间管理变得异常困难&#xff0c;因此&#xff0c;引入一款专业的制造ERP软件成为解决难题的有效途径。 在制造业引入E…

文件IO及目录IO——day05

文件IO还剩下一个知识点&#xff0c;今天主要内容是目录IO 文件IO lseek lseekoff_t lseek(int fd, off_t offset, int whence); 功能:重新设定文件描述符的偏移量 参数:fd:文件描述符offset:偏移量whence:SEEK_SET 文件开头SEEK_CUR 文件当前位置SEEK_END 文件末尾…

【PyQt6] 框选截图功能

1 简介 书接上回, 全屏截图实现起来很简单, 来点稍微复杂点的, 框选截图 原理很简单, 弄个控件实现全屏半透视, 在全屏控件上画一个选框或者再弄一个几乎全透的子控件,实现鼠标拖动,缩放,移动, 键盘wasd 微调 用一个控件实现起来会很完美, 但是逻辑全部堆砌在一起,看代码会很…

PWM功能介绍 和配置

泰山派默认提供了3组PWM的GPIO &#xff0c; 为了检测PWM的输出&#xff0c;我们可以配合逻辑分析仪来查看效果&#xff0c;或者搭配STC8的LED灯 PWM 测试 列举所有的PWM设备&#xff1a; # 查找所有有pwm名称的文件 find / -name "pwm" # pwm4: pwmfe6e0000 edp屏幕…

VPX信号处理卡设计原理图:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 信号处理 无线电通信

一、概述 本板卡基于标准6U VPX 架构&#xff0c;为通用高性能信号处理平台&#xff0c;系我公司自主研发。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司Virtex 7系列的FPGA XC7V690T-2FFG1761I作为主处理器&#xff0c;Xilinx 的Aritex XC7A200T作为辅助处理器。XC7A2…

OpenAI视频生成模型Sora的全面解析:从ViViT、扩散Transformer到NaViT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0、W.A.L.T》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

30分钟快速上手LaTex

文章目录 30 分钟快速上手 LATEX1.什么是LATEX?2.为什么学习LATEX?3.编写第一个LATEX程序4.LATEX文档的序言5.LATEX文档的标题、作者和日期信息6.LATEX文档的注释7.LATEX文档的粗体、斜体和下划线8.LATEX文档中添加图片9.LATEX中对图像进行标注、标签化和引用10.在LATEX中创建…

105.网游逆向分析与插件开发-网络通信封包解析-分析接收到的对话数据包

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;接收数据的初步逆向分析 通过上一个内容&#xff0c;找到了数据包出现的一个很重要的位置&#xff0c;只要hook之后就能很好的得到这个数据了 然后来到明文数据的位置&#xff0c;把数据包复制出来&…

跨境电商独立站是什么?为什么要做独立站?

独立站在近两年被推上风口&#xff0c;很多人跟风涌入赛道&#xff0c;但并不知道做独立网站的根本原因是什么&#xff1f;为什么跨境电商要做独立站&#xff1f; 今天分享这篇文章&#xff0c;希望能帮助正在建站或想要建站的朋友们建立起对独立站的优劣势、未来发展空间的一…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_4

《剑指Offer》笔记&题解&思路&技巧&优化_Part_4 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. LCR 148. 验证图书取出顺序——栈的压入、弹出序列2. LCR 14…

Linux:grep进阶(11)

Linux&#xff1a;shell脚本&#xff1a;基础使用&#xff08;4&#xff09;《正则表达式-grep工具》_shell grep 全角字符串-CSDN博客https://blog.csdn.net/w14768855/article/details/132338954?ops_request_misc%257B%2522request%255Fid%2522%253A%252217083360171680022…

状压dp,HDU1074.Doing Homework

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher giv…

【JavaEE】_HTTP响应

目录 1. 首行 2. 报头header 3.空行 4. 正文body 1. 首行 响应首行&#xff1a;版本号状态码状态码描述&#xff1b; HTTP状态码描述了这次响应的结果&#xff08;比如成功、失败&#xff0c;以及失败原因等&#xff09;&#xff1b; 1. HTTP状态码有&#xff1a; &#…

【EI会议征稿通知】第三届先进制造技术与制造系统国际学术会议(ICAMTMS 2024)

第三届先进制造技术与制造系统国际学术会议&#xff08;ICAMTMS 2024&#xff09; 2024 3rd International Conference on Advanced Manufacturing Technology and Manufacturing System 随着工业技术的发展&#xff0c;先进制造技术日益成为未来制造业发展的重大趋势和核心内…

Maven属性scope

参考&#xff1a; maven 中 scope标签的作用&#xff08;runtime、provided、test、compile 的作用&#xff09; 【Maven】属性scope依赖作用范围详解 scope为provided

VNCTF2024misc方向部分wp

文章目录 sqlsharkLearnOpenGLez_msbOnlyLocalSql sqlshark tshark -r sqlshark.pcap -Y "http" -T fields -e frame.len -e http.file_data > data.txt不太像常规的盲注&#xff0c;一次性发送两条很类似的payload&#xff0c;比常规的多了一个least在判断passw…

不懂咱就学,记不住多看几遍(二)

一、Redis分布式锁中加锁与解锁、过期如何续命 实现要点&#xff1a; 互斥性&#xff0c;同一时刻&#xff0c;只能有一个客户端持有锁。防止死锁发生&#xff0c;如果持有锁的客户端因崩溃而没有主动释放锁&#xff0c;也要保证锁可以释放并且其他客户端可以正常加锁。加锁和…

TypeScript(二):TypeScript的细节

TypeScript语法细节 联合类型&#xff08;满足其中一个即可&#xff09; 可以使用多种运算符&#xff0c;从现有的类型中构建新类型 const number|string 123 可以是这些类型中的任何值但是使用的时候需要小心 let virable: number | string 123function getData(id: numb…