Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中重用singleton对象的代码#_C#_Inheritance_Static_Singleton - Fatal编程技术网

C# 如何在C中重用singleton对象的代码#

C# 如何在C中重用singleton对象的代码#,c#,inheritance,static,singleton,C#,Inheritance,Static,Singleton,我在为我的项目设计课程时遇到了麻烦。目前,我们开发了两个结构相同但内部存在一些差异的项目 在项目A中,我有一个类ACore,其中包括类A配置,AEquipmentManager。我制作了一个对象ACore的实例,在项目的任何地方,我都可以使用:ACore.AConfiguration.XYZ(XYZ是AConfiguration类的方法或属性)或ACore.AEquipmentmanager.ABC(ABC是AEquipmentmanager类的方法或属性) 在项目B中,我仍然拥有与项目A相同的

我在为我的项目设计课程时遇到了麻烦。目前,我们开发了两个结构相同但内部存在一些差异的项目

在项目A中,我有一个类
ACore
,其中包括
类A配置,AEquipmentManager
。我制作了一个对象
ACore
的实例,在项目的任何地方,我都可以使用:
ACore.AConfiguration.XYZ
(XYZ是
AConfiguration
类的方法或属性)或
ACore.AEquipmentmanager.ABC
(ABC是
AEquipmentmanager
类的方法或属性)

在项目B中,我仍然拥有与项目A相同的结构(
BCore、BConfiguration、BEquipmentManager
)。但是
b配置
a配置
不同(因为每个项目都有不同的配置),而
BEquipmentManager
AEquipmentManager
也有不同的配置

我想重用类
ACore
BCore
的代码,因为它们具有相同的代码(初始化设备管理器、初始化配置、处置设备管理器、处置配置…)。现在,我想编写一个库
BaseCore
,它与
ACore
BCore
具有相同的结构(有两个类
Configuration
EquipmentManager
,相同的初始化函数,Dispose函数),并且具有特定的项目(如a项目、B项目,甚至以后的C、D项目)我可以使用
BaseCore
库类(用于重用代码),只需实现
XEquipmentManager
xconfig
取决于每个项目

在这种情况下,我最好的设计方式是什么?谢谢分享你的想法

问候,,
和阮

我认为你走对了方向

但我会使用接口:

  • 实现使用实现IConfiguable的类的核心类

  • 确保配置实现了IConfigurable和所有的
    相关方法

或者,您也可以这样做:

  • 实现使用配置类的核心类

  • 实现从继承的配置/b配置
    配置

  • 将A和B引用到同一个核心类,就是这样


希望能有帮助。

我认为你的思路是对的

但我会使用接口:

  • 实现使用实现IConfiguable的类的核心类

  • 确保配置实现了IConfigurable和所有的
    相关方法

或者,您也可以这样做:

  • 实现使用配置类的核心类

  • 实现从继承的配置/b配置
    配置

  • 将A和B引用到同一个核心类,就是这样


希望有帮助。

A配置和B配置是否有相同的方法集,但实现方式不同,还是这些方法集也不同?如果方法集相同,则可以使用接口来实现。您可以为配置和设备管理员定义一个接口。然后,您只需使用这些接口进行BaseCore。然后,您可以在BaseCore的构造中提供类似这样的具体实现(不包括单例)

注意:您必须初始化配置和AEquipmentmanager的实例。在像这样建造基础核心之前

AConfiguration conf = new AConfiguration();
AEquipmentmanager   eq   = new AEquipmentmanager();
BaseCore base = new BaseCore(conf eq);
或者,您可以简单地创建一个BaseCore构造函数,该构造函数使用一些枚举来向您指示哪个实现,然后在BaseCore构造函数中初始化相应类的实例

或者,您可以通过使用通用参数实现BaseCore来实现它,并通过这些参数提供配置和equipmentmanager实现。您仍然可以使用相同的接口,但实现BaseCore时要限制泛型参数。BaseCore看起来像这样:

class BaseCore<Configuration_type,Equipmentmanager_type>  
               where Configuration_type : IConfiguration, new() 
               where Equipmentmanager_type : IEquipmentmanager, new()
{
   public Configuration_type Configuration {get;};
   public Equipmentmanager_type Equipmentmanager {get;};

   BaseCore()
   {
      Configuration = new Configuration_type();
      Equipmentmanager   = new Equipmentmanager_type();
   }
}
classbasecore
其中配置类型:IConfiguration,new()
其中设备管理器类型:IEquipmentmanager,新()
{
公共配置_类型配置{get;};
公共设备管理器\类型设备管理器{get;};
BaseCore()
{
配置=新配置类型();
Equipmentmanager=新的Equipmentmanager_type();
}
}
但是,这会对需要无参数构造函数的类型施加约束。不过,应该可以在之后进行初始化

如果您想为特定配置专门化您的核心,您可以像这样从它继承

class Acore<Configuration_type,Equipmentmanager_type> :
BaseCore<Configuration_type,Equipmentmanager_type> 
    where Configuration_type : AConfiguration ,new()
    where Equipmentmanager_type : AEquipmentmanager, new()
{
    Acore() : base()
    {
        Configuration.intprop = 10;
    }

}
class Acore:
岩芯
其中配置类型:A配置,新()
其中设备管理器类型:AEquipmentmanager,新()
{
Acore():base()
{
Configuration.intprop=10;
}
}

注意,我在a配置上添加了一个属性,该属性在BaseCore中不可访问,但在ACore中可访问。

a配置和B配置是否具有相同的方法集,并且具有不同的实现,或者这些方法集是否也不同?如果方法集相同,则可以使用接口来实现。您可以为配置和设备管理员定义一个接口。然后,您只需使用这些接口进行BaseCore。然后,您可以在BaseCore的构造中提供类似这样的具体实现(不包括单例)

注意:您必须初始化配置和AEquipmentmanager的实例。在像这样建造基础核心之前

AConfiguration conf = new AConfiguration();
AEquipmentmanager   eq   = new AEquipmentmanager();
BaseCore base = new BaseCore(conf eq);
或者,您可以简单地创建一个BaseCore构造函数,该构造函数使用一些枚举来向您指示哪个实现,然后在BaseCore构造函数中初始化相应类的实例

或者,您可以通过实现BaseCore w来实现它