当前位置: 首页 > news >正文

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();}
}

相关文章:

C#抽象静态方法

抽象静态方法 在C# 11中&#xff0c;引入了对抽象静态接口成员的支持。这个特性可以让你在接口中定义静态抽象方法、属性、或事件。具体来说&#xff0c;一个接口可以定义一个或多个抽象静态成员&#xff0c;这些成员没有具体的实现。任何实现该接口的类或结构必须提供这些成员…...

小研究 - Mysql快速全同步复制技术的设计和应用(一)

Mysql半同步复制技术在高性能的数据管理中被广泛采用&#xff0c;但它在可靠性方面却存在不足.本文对半同步复制技术进行优化&#xff0c;提出了一种快速全同步复制技术&#xff0c;通过对半同步数据复制过程中的事务流程设置、线程资源合理应用、批量日志应用等技术手段&#…...

HTML <samp> 标签

定义和用法 以下元素都是短语元素。虽然这些标签定义的文本大多会呈现出特殊的样式&#xff0c;但实际上&#xff0c;这些标签都拥有确切的语义。 我们并不反对使用它们&#xff0c;但是如果您只是为了达到某种视觉效果而使用这些标签的话&#xff0c;我们建议您使用样式表&a…...

C之(8)linux动态库编译框架

C之(8)Linux动态库编译基础框架 Author&#xff1a; Once Day Date&#xff1a;2023年8月5日 漫漫长路&#xff0c;有人对你微笑过嘛… 参考引用文档&#xff1a; VERSION (LD) (sourceware.org)Warning Options (Using the GNU Compiler Collection (GCC))All about symbo…...

Zabbix网络拓扑配置

一、简介 网络拓扑功能是一项非常重要的功能&#xff0c;它可以直观展示网络设备主机状态及端口传输速率等指标信息&#xff0c;帮助运维人员快速发现和定位故障问题&#xff1b;Zabbix同样配备了强大的网络拓扑功能&#xff0c;如何使用Zabbix拓扑图功能创建一个公司网络拓扑…...

2.4G芯片XL2408开发板,SOP16封装,芯片集成1T 8051内核单片机

XL2408开发板可用于2.4G芯片XL2408开发板的开发调试。XL2408烧录仿真需要使用WS_LINK。XL2408开发板烧录仿真需要接4根线&#xff1a;PA13:DIO&#xff0c;PA14:CLK&#xff0c;VCC&#xff0c;GND。 XL2408芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块,…...

iPhone苹果手机地震预警功能怎么开启?

iPhone苹果手机地震预警功能怎么开启&#xff1f; 1、打开iPhone苹果手机设置&#xff1b; 2、在iPhone苹果手机设置内找到辅助功能&#xff1b; 3、在辅助功能内找到触控&#xff1b; 4、在iPhone苹果手机辅助功能触控内找到振动&#xff0c;如果是关闭状态请启&#xff1b; …...

Storm学习之使用官方Docker镜像快速搭建Storm运行环境

文章目录 0.前言搭建完的效果 1.教程1.1.docker 安装 zookeeper1.2. 安装 storm nimbus1.3.docker 安装 supervisor1.4.docker 安装 storm-ui1.5.查看已经启动的容器1.6.提交topology到 storm集群 2.总结3.参考文档 0.前言 Apache Storm 官方也出了Docker 镜像 https://hub.do…...

【GTest学习】

1. GTest简介&#xff1a; GTest 就是 Google Test, 它是一个免费开源的测试框架, 用于编写测试用 C语言编写的程序(C 程序也能用, 但是需要用 C编译器编译)。gtest的官方网站是&#xff1a;http://code.google.com/p/googletest/ 2.GTest下载与环境搭建&#xff1a; GTest 下…...

[JAVAee]网络通信基础

目录 IP地址 端口号 网络协议 五元组 TCP/IP五层模型 网络互连之间的目的就是为了相互通信,传输数据,是可以不同进程间的基于网络的数据传输. 而IP就可以确定网络通信的双方. IP地址 IP地址主要用于定位标识网络主机或其他网络设备的网络地址.(就像快递的收货地址一般…...

【HDFS】BlockManager#checkRedundancy方法详解

BlockManager#checkRedundancy这个方法只有一处调用点, 就是FSNamesystem#finalizeINodeFileUnderConstruction方法。 TODO:补充FSNamesystem#finalizeINodeFileUnderConstruction方法的调用点。 checkRedundancy方法的参数的BlockCollection对象bc,解释一下,INodeFile类是…...

c++ 拷贝构造

我们思考一下这个问题&#xff1a; 观察以下代码&#xff0c;在运行的时候会崩溃 想一想为什么 #include<iostream> using namespace std;//栈类 typedef int DataType; class Stack { public://默认构造&#xff1a;Stack(size_t capacity 3){_array (DataType*)ma…...

MISRA 2012学习笔记(1)-Directives

文章目录 说明Directives2 编译与构建Dir 2.1 3 需求可追溯性Dir 3.1 4 代码设计Dir 4.1Dir 4.2Dir 4.3Dir 4.4Dir 4.5Dir 4.6Dir 4.7Dir 4.8Dir 4.9Dir 4.10Dir 4.11Dir 4.12Dir 4.13 说明 以下等级一般分为三种&#xff0c;建议&#xff0c;必要&#xff0c;强制 建议&#…...

升级node版本后vue2的项目node-sass、sass-loader安装报错(14.x升级到16.x)

node升级到16.x版本后&#xff0c;对应的node-sass需要升级到^6.0.0&#xff0c;此时sass-loader的版本需要升级到10.2.0以上 &#xff0c;具体对应版本规则可参考链接: https://github.com/webpack-contrib/sass-loader/releases?page3 vue2通过vue/cli创建的项目&#xff0…...

深入理解CSS选择器:选择正确的方式掌控样式与布局

文章目录 CSS 概括CSS 选择器元素选择器&#xff08;Element Selector&#xff09;类选择器&#xff08;Class Selector&#xff09;ID 选择器&#xff08;ID Selector&#xff09;通用选择器&#xff08;Universal Selector&#xff09;属性选择器&#xff08;Attribute Selec…...

qt设置控件的风格样式

设置tablewidget ui.tableWidget_MaterialLibrary->setStyleSheet("QTableView {""color:#DCDCDC;""background-color: #444444;""border: 1px solid #242424;""alternate-background-color:#525252;""gridline-co…...

简单易懂的Transformer学习笔记

1. 整体概述 2. Encoder 2.1 Embedding 2.2 位置编码 2.2.1 为什么需要位置编码 2.2.2 位置编码公式 2.2.3 为什么位置编码可行 2.3 注意力机制 2.3.1 基本注意力机制 2.3.2 在Trm中是如何操作的 2.3.3 多头注意力机制 2.4 残差网络 2.5 Batch Normal & Layer Narmal 2.…...

C语言经典小游戏之三子棋(超详解释+源码)

“纵有疾风来&#xff0c;人生不言弃&#xff0c;风乍起&#xff0c;合当奋意向此生。” 今天我们一起来学习一下三子棋小游戏用C语言怎么写出来&#xff1f; 三子棋小游戏 1.游戏规则介绍2.游戏准备3.游戏的实现3.1生成菜单3.2游戏的具体实现3.2.1初始化棋盘3.2.2打印棋盘3.2…...

宝塔Linux面板点击SSL闪退打不开?怎么解决?

宝塔Linux面板点击SSL证书闪退如何解决&#xff1f;旧版本的宝塔Linux面板确实存在这种情况&#xff0c;如何解决&#xff1f;升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法&#xff1a; 宝塔面板点击SSL证书闪退解决方法 问题&#xff1a;宝塔Linux面板…...

Problem: 6953. 判断是否能拆分数组

Problem: 6953. 判断是否能拆分数组 文章目录 思路解题方法复杂度Code 思路 针对题目中的以下目标&#xff0c;可以转换寻求数组中是否存在前后两个元素之和>m的情况&#xff0c;如果存在则返回ture&#xff0c;如果不存在则返回false。能这样转换的原因是&#xff0c;如果…...

MobiSys 2023 | 多用户心跳监测的双重成形声学感知

注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷达学报 等)。本次介绍的论文是:<<MobiSys’23,Multi-User A…...

Netty:ChannelInitializer添加到ChannelPipeline完成任务以后会自动删除自己

说明 io.netty.channel.ChannelInitializer是一个特殊的ChannelInboundHandler。它的主要作用是向 Channel对应的ChannelPipeline中增加ChannelHandler。执行完ChannelInitializer的initChannel(C ch)函数以后&#xff0c;ChannelInitializer就会从ChannelPipeline自动删除自己…...

【VUE】项目本地开启https访问模式(vite4)

在实际开发中&#xff0c;有时候需要项目以https形式进行页面访问/调试&#xff0c;下面介绍下非vue-cli创建的vue项目如何开启https 环境 vue: ^3.2.47vite: ^4.1.4 根据官方文档&#xff1a;开发服务器选项 | Vite 官方中文文档 ps&#xff1a;首次操作&#xff0c;不要被类…...

【状态估计】一维粒子滤波研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

设计模式-迭代器模式在Java中使用示例

场景 为开发一套销售管理系统&#xff0c;在对该系统进行分析和设计时&#xff0c;发现经常需要对系统中的商品数据、客户数据等进行遍历&#xff0c; 为了复用这些遍历代码&#xff0c;开发人员设计了一个抽象的数据集合类AbstractObjectList&#xff0c;而将存储商品和客户…...

Maven入职学习

一、什么是Maven&#xff1f; 概念&#xff1a; Maven是一种框架。它可以用作依赖管理工具、构建工具。 它可以管理jar包的规模、jar包的来源、jar包之间的依赖关系。 它的用途就是管理规模庞大的jar包&#xff0c;脱离IDE环境执行构建操作。 具体使用&#xff1a; 工作机…...

【多音音频测试信号】具有指定采样率和样本数的多音信号,生成多音信号的相位降低波峰因数研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

LeetCode150道面试经典题-删除有序数组中的重复项(简单)

1.题目 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c…...

人大金仓数据库Docker部署

docker 搭建 yum -y install yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposystemctl start docker.servicesystemctl enable docker.servicesystemctl status docker.service 配置Docker cd /etc/docker/ vi da…...

Leetcode-每日一题【剑指 Offer 07. 重建二叉树】

题目 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7]Output: [3,9,20,null,null,15,7] 示例 2: Input: preo…...