C#面向对象编程中开闭原则的示例详解

yizhihongxing

C#面向对象编程中开闭原则的示例详解

什么是开闭原则

开闭原则(Open-Closed Principle)是面向对象编程中的一个重要原则,其定义如下:

软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。

也就是说,在软件设计的过程中,可以通过扩展已有的代码来增加新的功能,而不需要修改原有的代码。

如何实现开闭原则

使用抽象类或接口

使用抽象类或接口可以实现对扩展开放,对修改关闭的原则。这是因为抽象类或接口定义的方法、属性是抽象的,具体的实现是在子类中实现的,这样子类就可以根据需要自定义实现方法,而不需要修改父类或接口的实现。

利用多态性

利用多态性也可以实现对扩展开放,对修改关闭的原则。多态性的实现是通过父类或接口引用子类对象的方式来实现的,这样可以实现代码的灵活性和可扩展性。

示例说明1:汽车品牌展示

假设现在需要在一个网站上展示不同品牌的汽车,并需支持新增车型。如果按照开闭原则的设计思想,可以使用抽象类或接口来定义汽车和品牌,并利用多态性来实现对扩展开放,对修改关闭的原则。具体实现如下:

public abstract class Car
{
    public abstract string Brand { get; }
    public abstract string Model { get; }
    public abstract double Price { get; }
}

public class BMW : Car
{
    public override string Brand => "BMW";
    public override string Model => "X5";
    public override double Price => 300000;
}

public class Benz : Car
{
    public override string Brand => "Benz";
    public override string Model => "S600";
    public override double Price => 400000;
}

public interface ICarFactory
{
    Car CreateCar();
}

public class BMWFactory : ICarFactory
{
    public Car CreateCar()
    {
        return new BMW();
    }
}

public class BenzFactory : ICarFactory
{
    public Car CreateCar()
    {
        return new Benz();
    }
}

public class CarShop
{
    private List<ICarFactory> factories = new List<ICarFactory>();

    public CarShop()
    {
        factories.Add(new BMWFactory());
        factories.Add(new BenzFactory());
    }

    public void DisplayCars()
    {
        foreach (var factory in factories)
        {
            var car = factory.CreateCar();
            Console.WriteLine("Brand: {0}, Model: {1}, Price: {2}", car.Brand, car.Model, car.Price);
        }
    }
}

这里定义了一个抽象类Car和两个实现类BMWBenz,同时定义了一个工厂接口ICarFactory,以及两个工厂类BMWFactoryBenzFactory,通过实现工厂类的CreateCar()方法返回对应的汽车对象。最后在CarShop中使用工厂类来展示汽车信息。

如果新增一个品牌比如Audi,只需要新增一个类AudiFactory实现ICarFactory接口即可,而不需修改已有的代码。

示例说明2:图标组件功能扩展

假设现在需要开发一个图标组件,支持多种类型的图标,如圆形、矩形、三角形等,并且需要支持新增图标类型。按照开闭原则的设计思想,可以使用抽象类或接口来定义图标和图标类型,并利用多态性来实现对扩展开放,对修改关闭的原则。具体实现如下:

public abstract class Shape
{
    public abstract void Draw();
}

public class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Draw a circle.");
    }
}

public class Rect : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Draw a rectangle.");
    }
}

public interface IShapeFactory
{
    Shape CreateShape();
}

public class CircleFactory : IShapeFactory
{
    public Shape CreateShape()
    {
        return new Circle();
    }
}

public class RectFactory : IShapeFactory
{
    public Shape CreateShape()
    {
        return new Rect();
    }
}

public class Component
{
    private List<IShapeFactory> factories = new List<IShapeFactory>();

    public Component()
    {
        factories.Add(new CircleFactory());
        factories.Add(new RectFactory());
    }

    public void AddShapeFactory(IShapeFactory factory)
    {
        factories.Add(factory);
    }

    public void DrawShapes()
    {
        foreach (var factory in factories)
        {
            var shape = factory.CreateShape();
            shape.Draw();
        }
    }
}

这里定义了一个抽象类Shape和两个实现类CircleRect,同时定义了一个工厂接口IShapeFactory,以及两个工厂类CircleFactoryRectFactory,通过实现工厂类的CreateShape()方法返回对应的图标对象。最后在Component组件中使用工厂类来展示图标信息。

如果新增一个图标类型比如Triangle,只需要新增一个类TriangleFactory实现IShapeFactory接口即可,而不需修改已有的代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#面向对象编程中开闭原则的示例详解 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#、ASP.NET通用扩展工具类之LogicSugar

    首先感谢您对LogicSugar工具类的关注与使用,下面详细讲解一下该工具类的完整攻略。 一、概述 LogicSugar是一款C#、ASP.NET通用扩展工具类库,主要提供了一些常用的快捷方法和扩展类,帮助C#和ASP.NET开发者快速高效地完成开发工作。LogicSugar的特点是简单易用、代码量少、维护性强、可以更加方便地扩展使用。 二、安装和使用 Lo…

    C# 2023年5月15日
    00
  • .NET Core中依赖注入AutoMapper的方法示例

    .NET Core中依赖注入AutoMapper的方法示例 AutoMapper是常用于对象映射的库,它可以方便地将一个对象的属性映射到另一个对象中。使用依赖注入(Dependency Injection,DI)可以将AutoMapper集成到.NET Core中,使其更加易于使用和管理。 第一步:安装AutoMapper和AutoMapper.Extens…

    C# 2023年6月3日
    00
  • C#.NET发送邮件的实例代码

    以下是关于C#.NET发送邮件的实例代码的完整攻略: 基础知识 在进行C#.NET发送邮件之前,需要了解以下几个基础概念: SMTP服务器 SMTP服务器指的是用于发送邮件的服务器。在进行C#.NET发送邮件时,需要设置邮件发送所使用的SMTP服务器,以便将邮件成功发送至对方邮箱。 邮件协议 邮件协议是指用于发送和接收邮件的协议。常见的邮件协议有POP3、I…

    C# 2023年5月31日
    00
  • C#如何删除指定文件或文件夹

    当我们需要在C#中删除指定的文件或文件夹时,可以使用.NET框架中的System.IO命名空间提供的相关类和方法来实现。 删除指定的文件 使用System.IO.File类的静态方法Delete()可以删除指定的文件,代码示例如下: using System.IO; string filePath = @"C:\test\test.txt&quot…

    C# 2023年6月1日
    00
  • Unity查找游戏物体的六种方式详解

    Unity查找游戏物体的六种方式详解 在Unity中,查找游戏物体是十分常见的操作。本文将介绍Unity中六种查找游戏物体的方式,并且针对每种方式,提供相应的示例进行说明。 1. 通过GameObject.name查找 通过GameObject.name查找游戏物体是最简单、最基本的查找方式。示例代码如下所示: // 通过游戏物体名查找游戏物体 GameOb…

    C# 2023年5月15日
    00
  • C#实现异步编程的方法

    C#实现异步编程的方式有很多种,我们分别来讲解一下。 1. 使用async/await关键字 async/await是C#5.0版本中引入的一种异步编程方式,它可以将异步代码的编写和使用变得非常简单。使用async/await,可以将异步操作的结果异步返回给调用方,并且不会阻塞调用线程。 示例1 public async Task<int> Ta…

    C# 2023年6月6日
    00
  • c# 遍历 Dictionary的四种方式

    在C#中,Dictionary是一种常用的数据结构,它提供了一种键值对的映射关系。在本文中,我们将介绍四种遍历Dictionary的方式,并提供两个示例说明。 示例一:创建一个Dictionary 在这个示例中,我们将创建一个Dictionary,其中包含一些键值对。 using System; using System.Collections.Generi…

    C# 2023年5月17日
    00
  • C# Path.GetRandomFileName – 获取一个随机文件名

    Path.GetRandomFileName 方法是C#中的一个静态方法,其返回一个随机生成的文件名(不包含路径),该方法的作用是用于生成一个随机的文件名,以避免文件名的冲突问题。 使用该方法非常简单,只需要在代码中调用该静态方法即可,该方法的语法格式如下: public static string GetRandomFileName(); 该方法返回一个字…

    C# 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部