首页 > 编程语言 >C#抽象静态方法

C#抽象静态方法

时间:2023-08-07 12:55:52浏览次数:33  
标签:静态方法 C# void abstract class 抽象 接口 static public

抽象静态方法

在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转换为MyOtherClass
        return 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#,void,abstract,class,抽象,接口,static,public
From: https://www.cnblogs.com/yyfh/p/17610212.html

相关文章

  • vue报错 Multiple assets emit different content to the same filename index.html
    vue-cli版本:@vue/[email protected]报错现象:想把css和script全部内嵌到html文件中,就用了"HtmlInlineScriptPlugin"插件,打包后js代码被嵌到了head里,导致代码提前执行找不到#app,再配置HtmlWebpackPlugin插件通过inject:"body"指定代码内嵌到body,打包报错"Multipleassetsemitdiff......
  • Go语言:调用cmd隐藏黑窗口的方法(包括子进程)(转)
    说明:通过 go 的标准库 exec 调用 cmd 命令时会弹出 cmd的黑窗口只需要在编译时加入参数:-ldflags="-Hwindowsgui"示例如下:gobuild-ldflags="-Hwindowsgui-w-s"main.go通过子进程调用的cmd命令会弹黑窗口:示例如下:cmd:=exec.Command(`cmd`,`/......
  • Java调度算法实现与应用(FCFS、SJF、RR、HPF)
    文章目录一、调度算法概述二、先来先服务(FCFS)算法1、概述2、Java实现FCFS3、优缺点三、短作业优先(SJF)算法1、概述2、Java实现SJF3、优缺点四、时间片轮转(RR)算法1、概述2、Java实现RR3、优缺点五、优先级调度(HPF)算法1、概述2、Java实现HPF一、调度算法概述调度算法常见于操作系统......
  • StampedLock使用及源码分析:号称比读写锁还要快的锁
    文章目录一、StampedLock锁概述1、StampedLock锁简介2、ReentrantReadWriteLock回顾3、ReentrantReadWriteLock导致锁饥饿问题4、锁饥饿问题的缓解5、StampedLock与ReentrantReadWriteLock的对比6、StampedLock特点7、StampedLock的缺点二、StampedLock的使用1、StampedLock的三种......
  • 解决报错:Redis ERR unknown command ‘FLUSHDB‘
    RedisERRunknowncommand‘FLUSHDB’报错信息:ERRunknowncommand`flushdb`ERRunknowncommand`flushall`解决方案:我的redis版本是5.0.7修改配置文件打开/etc/redis/redis.conf文件,将下面两行代码注释掉rename-commandFLUSHALL37_dba_FLUSHALLrename-commandFLUSHDB......
  • 解析json数据导出某个字段的值到excel(记录)
    记录一下导出代码publicstaticvoidmain(String[]args){ //将你的json数据放在txt文档里并复制路径到下面StringfilePath="E:/home/2023年需求/人才/20230801出表/job_mobile_json.txt";//替换成你的文件路径try{Stringcontent=r......
  • 【Python】PySpark 数据计算 ④ ( RDD#filter 方法 - 过滤 RDD 中的元素 | RDD#distin
    文章目录一、RDD#filter方法1、RDD#filter方法简介2、RDD#filter函数语法3、代码示例-RDD#filter方法示例二、RDD#distinct方法1、RDD#distinct方法简介2、代码示例-RDD#distinct方法示例一、RDD#filter方法1、RDD#filter方法简介RDD#filter方法可以根据指定......
  • 计算两条直线夹角(C++)
    计算两条直线的锐角可以使用向量的知识来实现。在C++中,我们可以定义一个函数来计算两个向量的夹角,并根据夹角的余弦值来判断角度的大小。以下是一个用C++编写的示例代码:#include<iostream>#include<cmath>usingnamespacestd;structVector{doublex;doubley;......
  • LeetCode 周赛上分之旅 # 37 多源 BFS 与连通性问题
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......
  • [ABC313] C~E 题解
    [ABC313]C~E题解C-ApproximateEqualization2让所有的数字都尽量接近平均数,先算出平均数,然后把所有数字分成两份,一份要加,一份要减,因为平均数有余数,余数肯定给最大的几个,所以这样计算总共需要加减多少个,然后在加减里面取\(\max\)即可。时间复杂度:\(O(n\logn)\)#include......