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

C#的单继承限制下实现派生类ChildClass既继承BaseClass又成为单例的方法

在 C# 中,类只能继承一个父类(单继承限制)。当前 Singleton 是通过继承实现的,因此如果 ChildClass 既要继承 BaseClass 又要成为单例,直接使用当前的 Singleton 实现会遇到继承冲突。

解决方案

方案一:使用组合模式(推荐)

让 ChildClass 继承 BaseClass ,同时内部持有一个单例实例,通过静态属性暴露。

public class BaseClass
{
    // 基类逻辑
}public class ChildClass : BaseClass
{
    private static ChildClass 
    _instance;
    private static readonly object 
    _locker = new object();    private ChildClass() : base() 
    { }    public static ChildClass 
    Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_locker)
                {
                    if (_instance 
                    == null)
                    {
                        _instance = 
                        new 
                        ChildClass
                        ();
                    }
                }
            }
            return _instance;
        }
    }
}

方案二:修改 Singleton 实现为接口+扩展方法

将 Singleton 改为接口,通过扩展方法提供单例功能,这样 ChildClass 可以同时继承 BaseClass 并实现 ISingleton 接口。

// 定义单例接口
public interface ISingleton
{
    void Init();
}// 扩展方法实现单例逻辑
public static class 
SingletonExtensions
{
    private static readonly 
    Dictionary<Type, object> 
    _instances = new 
    Dictionary<Type, object>();
    private static readonly object 
    _locker = new object();    public static T GetInstance<T>
    (this T instance) where T : 
    class, ISingleton, new()
    {
        lock (_locker)
        {
            if (!_instances.
            TryGetValue(typeof(T), 
            out var obj))
            {
                obj = new T();
                ((ISingleton)obj).
                Init();
                _instances[typeof
                (T)] = obj;
            }
            return (T)obj;
        }
    }
}// 使用方式
public class BaseClass
{
    // 基类逻辑
}public class ChildClass : 
BaseClass, ISingleton
{
    public void Init()
    {
        // 初始化逻辑
    }
}// 访问方式
var instance = default(ChildClass).
GetInstance();

方案三:调整继承结构

如果 BaseClass 本身不需要实例化,可以让 BaseClass 继承 Singleton ,然后 ChildClass 继承 BaseClass 。但这种方式的单例实例类型是 BaseClass ,不是 ChildClass 。

public class BaseClass : 
Singleton<BaseClass>
{
    // 基类逻辑
}public class ChildClass : BaseClass
{
    // 子类逻辑
}// 访问方式(只能通过 BaseClass.
instance 访问,类型为 BaseClass)
var instance = BaseClass.instance;

推荐方案

方案一(组合模式) 是最灵活的解决方案,它:

  • 避免了 C# 单继承的限制
  • 保持了代码的清晰性和可维护性
  • 允许 ChildClass 正常继承 BaseClass
  • 实现了完整的单例功能

注意事项

  • 单例模式应谨慎使用,避免过度依赖
  • 确保单例的线程安全性(如方案一中的双重检查锁定)
  • 考虑单例的生命周期管理(如需要时的销毁)
    通过以上方案,可以在 C# 的单继承限制下,实现 ChildClass 既继承 BaseClass 又成为单例的需求。
http://www.jsqmd.com/news/570716/

相关文章:

  • MicroPython混合编程实战:ESP32如何优雅调用C模块(LED案例详解)
  • 三步掌握BilibiliDown:打造你的B站视频离线收藏库
  • 别再死记硬背了!用MATLAB rlocus函数5分钟搞定自动控制根轨迹图(附实战代码)
  • HY-MT1.5翻译效果实测:33种语言互译,效果惊艳
  • HsMod炉石传说插件全攻略:从入门到精通的个性化游戏体验
  • 猫抓插件:资源嗅探技术如何重塑浏览器媒体捕获体验
  • 别再死磕傅里叶了!用Python+PyWavelets搞定信号突变检测(附实战代码)
  • 手把手教你用Xilinx FPGA搭建100G RDMA测试环境(从IP配置到PC互联)
  • 从MCP2515发送邮箱满到总线错误:一次CAN通信故障的深度排查实录
  • OpenCore Legacy Patcher架构深度解析:老设备macOS升级的工程实践
  • OWL ADVENTURE新手教程:上传图片就能对话的AI助手怎么用?
  • 快速构建天气查询智能体:用快马平台十分钟完成原型开发
  • 博图程序需要手动同步_西门子S7-200SMART PLC 常见问题
  • Docker部署n8n遇到Secure Cookie警告?一个环境变量N8N_SECURE_COOKIE=false就能搞定
  • 从数据‘堵车’到‘高速路’:深入拆解AXI DMA的Scatter/Gather引擎如何实现零拷贝传输
  • BGE Reranker-v2-m3在VSCode插件开发中的应用
  • RAG 正在换轨:从“多查几次“到“让系统学会记忆和判断“
  • 26.4.1~26.4.14
  • 解决金牌影院抓包软件退出问题
  • 在VMware里给国产麒麟系统Kylin-Server-V10-SP3装vmtools,我踩了这些坑(附完整解决流程)
  • SOONet模型内网穿透部署方案:在本地服务器提供远程视频分析服务
  • foobox-cn:重塑你的foobar2000音乐体验,5分钟打造专业级播放器界面
  • 实测IndexTTS2 V23:情感控制更自然的AI语音合成效果展示
  • ModbusRTU通信协议实战:从报文解析到功能测试
  • WPF HALCON 交互式ROI绘制:从Canvas坐标映射到HWindow的实战解析
  • 分析2026年江苏数控编程培训服务哪家权威,国匠教育口碑好 - mypinpai
  • 别再只会用FFT了!用MATLAB的czt函数实现窄带信号高分辨率频谱分析
  • Qwen3-TTS实战:制作有声书全流程,克隆叙述者声音保持一致性
  • Windows下用VSCode配置黄山派SF32开发环境,避开Python 3.14的坑
  • 如何快速实现SketchUp模型到3D打印的完美转换:SketchUp STL插件终极指南