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


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)
————————————————

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

相关推荐

  1. C++封装继承

    2024-02-19 16:18:01       7 阅读
  2. python 继承封装

    2024-02-19 16:18:01       11 阅读
  3. go继承模拟实现

    2024-02-19 16:18:01       11 阅读
  4. Python封装是如何实现

    2024-02-19 16:18:01       7 阅读
  5. 如何在原型实现继承

    2024-02-19 16:18:01       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-19 16:18:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-19 16:18:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-19 16:18:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-19 16:18:01       18 阅读

热门阅读

  1. 开源软件的影响力

    2024-02-19 16:18:01       32 阅读
  2. UTF-8 与 UTF-16区别详解

    2024-02-19 16:18:01       28 阅读
  3. 主流开发语言和开发环境?

    2024-02-19 16:18:01       34 阅读
  4. 如何在 Linux 系统中查看系统日志

    2024-02-19 16:18:01       27 阅读
  5. B 样条基函数

    2024-02-19 16:18:01       23 阅读
  6. 如何使音频类app广告变现收益最大化

    2024-02-19 16:18:01       31 阅读
  7. hostname的查看和设置

    2024-02-19 16:18:01       36 阅读
  8. 软考笔记--数据挖掘技术

    2024-02-19 16:18:01       27 阅读