C#抽象静态方法

抽象静态方法

在C# 11中,引入了对抽象静态接口成员的支持。这个特性可以让你在接口中定义静态抽象方法、属性、或事件。具体来说,一个接口可以定义一个或多个抽象静态成员,这些成员没有具体的实现。任何实现该接口的类或结构必须提供这些成员的静态实现。这就像实现普通接口成员一样,只不过是静态的。当然,你也可以基于它来实现一些设计模式,本文将展开介绍。

  1. 单例模式:静态抽象成员可以用于实现单例模式。在这种模式中,一个类只能有一个实例,并提供一个全局访问点。
public interface ISingleton
{static abstract ISingleton Instance { get; }
}public class Singleton : ISingleton
{private static readonly Singleton _instance = new Singleton();private Singleton() { }public static ISingleton Instance => _instance;
}

在代码中,定义了一个名为ISingleton的接口,其中包含一个静态抽象属性Instance。然后,创建了一个实现这个接口的Singleton类。这个类有一个私有构造函数,保证不能从类外部创建其实例,从而确保只有一个实例存在。同时,这个类有一个静态的Instance属性,这个属性返回Singleton类的唯一实例。

  1. 工厂方法模式:这是一个创建型设计模式,它提供了一种在代码中创建对象而不指定其具体类的方法。
public interface IFactory<T>
{static abstract T Create();
}public class MyClass : IFactory<MyClass>
{public static MyClass Create(){return new MyClass();}
}
  1. 策略模式:这是一种行为设计模式,它将一系列算法封装在一个系列的独立策略类中。在运行时,可以选择使用哪种算法。
public interface IStrategy
{static abstract void Execute();
}public class ConcreteStrategyA : IStrategy
{public static void Execute(){Console.WriteLine("Strategy A");}
}public class ConcreteStrategyB : IStrategy
{public static void Execute(){Console.WriteLine("Strategy B");}
}public class Context
{public void ContextInterface<T>() where T : IStrategy{T.Execute();}
}
  1. 建造者模式:在建造者模式中,你可以使用静态抽象接口成员来定义一个创建复杂对象的通用接口:
public interface IBuilder
{static abstract IBuilder StartBuilding();IBuilder SetSize(int size);IBuilder SetColor(string color);object Build();
}

然后在具体的建造者类中实现这个接口:

public class HouseBuilder : IBuilder
{private int _size;private string _color;public static IBuilder StartBuilding(){return new HouseBuilder();}public IBuilder SetSize(int size){_size = size;return this;}public IBuilder SetColor(string color){_color = color;return this;}public object Build(){return new House(_size, _color);}
}
  1. 原型模式:在原型模式中,你可以使用静态抽象接口成员来定义一个克隆自身的通用接口:
public interface IPrototype<T>
{static abstract T Clone(T instance);
}

然后在具体的原型类中实现这个接口:

public class Sheep : IPrototype<Sheep>{public string Name { get; set; }public Sheep(string name){Name = name;}public static Sheep Clone(Sheep instance){return new Sheep(instance.Name);}}

这样,你就可以使用Sheep.Clone(sheep)来克隆一个Sheep的实例。

  1. 享元模式:可以用静态抽象接口成员实现一个工厂方法,该工厂方法负责创建共享对象。如果对象已经存在,工厂方法将返回现有对象,否则将创建新对象。
public interface IFlyweight<T>
{static abstract T GetFlyweight(string key);
}public class FlyweightFactory : IFlyweight<MyClass>
{private static Dictionary<string, MyClass> _flyweights = new Dictionary<string, MyClass>();public static MyClass GetFlyweight(string key){if (!_flyweights.ContainsKey(key)){_flyweights[key] = new MyClass();}return _flyweights[key];}
}
  1. 装饰器模式:可以使用静态抽象接口成员来定义创建装饰对象的方法。
public interface IDecorator<T>
{static abstract T Decorate(T instance);
}public class Decorator : IDecorator<MyClass>
{public static MyClass Decorate(MyClass instance){// 添加装饰行为return instance;}
}
  1. 适配器模式:可以使用静态抽象接口成员来定义将一个类型转换为另一个类型的适配器方法。
public interface IAdapter<TSource, TTarget>
{static abstract TTarget Adapt(TSource source);
}public class Adapter : IAdapter<MyClass, MyOtherClass>
{public static MyOtherClass Adapt(MyClass source){// 将MyClass转换为MyOtherClassreturn new MyOtherClass();}
}
  1. 观察者模式:可以使用静态抽象接口成员来定义注册和注销观察者的方法。
public interface IObservable<T>
{static abstract void RegisterObserver(T observer);static abstract void UnregisterObserver(T observer);
}public class ConcreteObservable : IObservable<IObserver>
{private static List<IObserver> observers = new List<IObserver>();public static void RegisterObserver(IObserver observer){observers.Add(observer);}public static void UnregisterObserver(IObserver observer){observers.Remove(observer);}
}
  1. 命令模式:可以使用静态抽象接口成员来定义执行和撤销命令的方法。
public interface ICommand
{static abstract void Execute();static abstract void Undo();
}public class ConcreteCommand : ICommand
{public static void Execute(){// 执行具体命令}public static void Undo(){// 撤销具体命令}
}
  1. 状态模式:可以使用静态抽象接口成员来定义改变和获取状态的方法。
public interface IState
{static abstract void ChangeState(IState state);static abstract IState GetState();
}public class ConcreteState : IState
{private static IState currentState;public static void ChangeState(IState state){currentState = state;}public static IState GetState(){return currentState;}
}
  1. 代理模式:在代理模式中,你可以使用静态抽象接口成员来定义创建代理对象的接口:
public interface IProxy<T>
{static abstract T CreateProxy(T realObject);
}public class RealObjectProxy : IProxy<RealObject>
{private RealObject _realObject;public static RealObjectProxy CreateProxy(RealObject realObject){return new RealObjectProxy { _realObject = realObject };}// 实现 RealObject 的方法,添加额外的代理逻辑
}
  1. 责任链模式:在责任链模式中,你可以使用静态抽象接口成员来定义设置下一个处理者的接口:
public interface IHandler
{static abstract void SetNext(IHandler handler);
}public class ConcreteHandlerA : IHandler
{private static IHandler _next;public static void SetNext(IHandler handler){_next = handler;}// 处理请求的方法,如果不能处理则传递给 _next
}public class ConcreteHandlerB : IHandler
{private static IHandler _next;public static void SetNext(IHandler handler){_next = handler;}// 处理请求的方法,如果不能处理则传递给 _next
}
  1. 模板方法模式:在模板方法模式中,你可以使用静态抽象接口成员来定义算法的框架:
public interface IAlgorithm
{static abstract void AlgorithmStep1();static abstract void AlgorithmStep2();
}public class ConcreteAlgorithm : IAlgorithm
{public static void AlgorithmStep1(){// 实现步骤 1 的具体操作}public static void AlgorithmStep2(){// 实现步骤 2 的具体操作}public static void RunAlgorithm(){AlgorithmStep1();AlgorithmStep2();}
}

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

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

相关文章

策略模式实战应用

场景 假设做了个卖课网站&#xff0c;会员等级分为月vip、年vip、终生vip&#xff0c;每个等级买课的优惠力度不一样&#xff0c;传统的写法肯定是一堆的 if-else&#xff0c;现在使用策略模式写出代码实现 代码实现 策略模式的核心思想就是对扩展开放&#xff0c;对修改关闭…

【ACM算法竞赛日常训练】【奇♂妙拆分】【区区区间间间】【小AA的数列】数学 | 位运算 | 前缀和

DAY16共3题&#xff1a; 奇♂妙拆分&#xff08;简单数学&#xff09; 区区区间间间&#xff08;单调栈&#xff09; 小AA的数列&#xff08;位运算dp&#xff09; &#x1f388; 作者&#xff1a;Eriktse &#x1f388; 简介&#xff1a;19岁&#xff0c;211计算机在读&…

应用案例|基于三维机器视觉的机器人纸箱拆码垛应用解决方案

Part.1 项目背景 在现代物流和制造行业中&#xff0c;纸箱的拆码垛操作是一项重要且频繁的任务。传统的纸箱拆码垛工作通常由人工完成&#xff0c;这种方式存在劳动强度大、生产效率低以及人为操作容易导致错误等问题&#xff0c;严重影响物料的安全运输和质量。为了满足物流行…

【Antd】antd form表单的rules文案无法跟随状态重渲染的原因及解决办法

问题背景 我有两个表单项&#xff0c;当我选择出库类型&#xff0c;调用onChange改变inOutType 状态&#xff0c;这时候发现这句代码不生效&#xff1a; rules{[{ required: true, message: 请选择${inOutType 1 ? 持有人 : 负责人} }]}示例代码 <TypographyForm.Group…

大模型“瘦身”进手机 下一个iPhone时刻将至?

一股“端侧大模型”浪潮正在涌来。华为、高通等芯片巨头正探索将AI大模型植入端侧&#xff0c;让手机实现新一代物种进化。 相比ChatGPT、Midjourney等AI应用依赖云端服务器提供服务&#xff0c;端侧大模型主打在本地实现智能化。它的优势在于能够更好地保护隐私&#xff0c;同…

有没有推荐的golang的练手项目?

前言 下面是github上的golang项目&#xff0c;适合练手&#xff0c;可以自己选择一些项目去练习&#xff0c;整理不易&#xff0c;希望能多多点赞收藏一下&#xff01;废话少说&#xff0c;我们直接进入正题>>> 先推荐几个教程性质的项目&#xff08;用于新手学习、巩…

Python中replace()函数详解

目录 语法 参数 返回值 实例 语法 replace() 函数是 Python 字符串对象的内置方法之一&#xff0c;用于将字符串中的指定子串替换为新的子串。 str.replace(old, new[, count])参数 old&#xff1a;需要被替换的旧子串。new&#xff1a;替换后的新子串。count&#xff…

RS-232标准

目录 1、概述2、RS-232接口的特点3、RS-232接口协议【仿真】 1、概述 RS-232接口是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换…

redis学习笔记(五)

文章目录 hash&#xff08;哈希&#xff09;&#xff08;1&#xff09;设置指定键的属性/域&#xff08;2&#xff09;获取指定键的域/属性的值&#xff08;3&#xff09;获取hash的所有域值对&#xff08;4&#xff09;删除指定键的域/属性&#xff08;5&#xff09;判断指定属…

Hadoop理论及实践-HDFS读写数据流程(参考Hadoop官网)

NameNode与DataNode回顾 主节点和副本节点通常指的是Hadoop分布式文件系统&#xff08;HDFS&#xff09;中的NameNode和DataNode。 NameNode&#xff08;主节点&#xff09;&#xff1a;NameNode是Hadoop集群中的一个核心组件&#xff0c;它负责管理文件系统的命名空间和元数据…

arcgis pro 3.0.2 安装及 geemap

arcgis pro 3.0.2 安装及 geemap arcgis pro 3.0.2 安装 arcgis pro 3 版本已经很多了&#xff0c;在网上找到资源就可以进行安装 需要注意的是&#xff1a;有的文件破解文件缺少&#xff0c;导致破解不成功。 能够新建地图就是成功了&#xff01; geemap安装 1.需要进行环…

Python web实战之Django 的 WebSocket 支持详解

关键词&#xff1a;Python, Django, WebSocket, Web 如何使用 Django 实现 WebSocket 功能&#xff1f;本文将详细介绍 WebSocket 的概念、Django 的 WebSocket 支持以及如何利用它来创建动态、响应式的 Web 应用。 1. WebSocket 简介 1.1 什么是 WebSocket&#xff1f; 在 W…

【果树农药喷洒机器人】Part7:静态PWM变量喷药实验

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

k8s界面化平台dashboard、kubesphere、Rancher对比

k8s集群管理dashboard有很多&#xff0c;比如kuboard、官方发dashboard、kubesphere、Rancher等等。 Dashboard、KubeSphere 和 Rancher 都是流行的 Kubernetes 管理和操作界面。它们都提供了图形化的用户界面&#xff0c;以简化对 Kubernetes 集群的管理和监控。每个工具都有其…

【编程指南】ES2016到ES2023新特性解析一网打尽

ES2016 Array.prototype.includes() Array.prototype.includes 方法&#xff1a; 这个方法用于检查数组是否包含特定元素&#xff0c;如果包含则返回 true&#xff0c;否则返回 false // 我有一个水果篮子 const fruitBasket [apple, banana, orange, grape];// 我要检查篮…

pycharm配置conda虚拟环境

&#x1f4d5;作者简介&#xff1a;热编程的贝贝&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步健身&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于贝贝的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏深度学习、…

iOS开发-实现二维码扫一扫Scan及识别图片中二维码功能

iOS开发-实现二维码扫一扫Scan及识别图片中二维码功能 在iOS开发中&#xff0c;会遇到扫一扫功能&#xff0c;扫一扫是使用摄像头扫码二维码或者条形码&#xff0c;获取对应二维码或条形码内容字符串。通过获得的字符串进行跳转或者打开某个页面开启下一步的业务逻辑。 https…

RFID工业识别技术:供应链智能化的科技颠覆

RFID工业识别技术&#xff0c;作为物联网的先锋&#xff0c;正在供应链管理领域展现着前所未有的科技颠覆。从物料追踪到库存管理&#xff0c;再到物流配送&#xff0c;RFID技术以其高效的数据采集和智能的自动化处理&#xff0c;彻底改变着传统供应链的运营方式。 RFID在物料追…

ETF套利及交易者如何进行套利的

ETF套利 什么是ETF套利为什么同一ETF在不同交易所上的价格会出现差异&#xff1f;如何操作ETF套利交易所如何解决ETF套利问题的&#xff1f; 什么是ETF套利 ETF&#xff08;Exchange-Traded Fund&#xff09;套利是一种通过利用市场中不同交易所交易价格之间的差异来获得利润的…

Django各种缓存的配置

Django提供了多种缓存后端&#xff0c;如内存缓存、文件缓存、数据库缓存、Memcached和Redis等。根据项目需求选择合适的缓存后端。 settings配置 在Django项目的settings.py文件中&#xff0c;找到或新增CACHES配置项。根据所选的缓存后端&#xff0c;配置相应的参数。以下是…