通过接口扩展功能

时间:2014-04-07 00:15:09

标签: c# inheritance architecture interface nullreferenceexception

我实现了一个接口IService,它继承了一系列其他接口的功能,并作为许多不同服务的共同基础。

每个服务都由接口描述,例如:

public interface IServiceOne : IService 
{
  //...
}

public class ServiceOne : IServiceOne
{
  //...
}

到目前为止的一切都按预期工作:

IServiceOne serviceOne = new ServiceOne();
IServiceTwo serviceTwo = new ServiceTwo(); 

我现在要做的是为每个服务添加一个大的常量(公共变量)列表,但是每个服务类型会有所不同(例如,IServiceOne将具有与{不同的常量} {1}},IServiceTwo中将存在IServiceOne中不存在的常量等。

我想要达到的目标是:

IServiceTwo

仅仅因为变量因服务类型而异,我决定为每个变量实现一个额外的接口:

IServiceOne serviceOne = new ServiceOne();
var someConstantValue = serviceOne.Const.SomeConstant;

然后扩大我的public interface IServiceOneConstants { //... } 定义:

IService

我现在遇到的问题是我不知道如何实现public interface IServiceOne : IService, IServiceOneConstants { //... } public class ServiceOne : IServiceOne { //... } 的具体类。显然,当它的一个变量(我们在这里称它们为常量)将被调用时,它必须被实例化,所以最初我虽然是IServiceOneConstants类但是你不能暴露static类&#39 ;通过界面的功能。然后,我尝试使用static进行操作,并通过公共非静态包装器公开其singleton

instance

然后我调整public class Singleton : IServiceOneConstants { private static Singleton _instance; private Singleton() { SomeConstant = "Some value"; } public static Singleton Instance { get { if (_instance == null) { _instance = new Singleton(); } return _instance; } } public String SomeConstant { get; set; } public Singleton Const { get { return Instance; } } } 就像那样:

IServiceOneConstants

但是当我这样称呼时:

public interface IServiceOneConstants
{
   Singleton Const { get; }
}

我收到IServiceOne serviceOne = new ServiceOne(); var someConstantValue = serviceOne.Const.SomeConstant; 个异常,因为null reference为空。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

通过命名不同的东西同名,你真的帮助自己变得困惑;)

所以,首先...... 你要做的是通过实例属性访问单例实例:

public Singleton Const
    {
        get
        {
            return Instance;
        }
    }

然后你就像使用它一样:

serviceOne.Const

但该变量从未分配过。为了分配它,你应该创建一个Singleton类的实例,将它分配给serviceOne.Const属性然后你可以使用它。

你需要的可能是这样的:

public class ServiceOne : IServiceOne
{
   public Singleton Const
   { 
      get
      {
         return Singleton.Instance;
      }
   }
}

答案 1 :(得分:0)

您需要检查单身是否已在ServiceOne.Const.SomeConstant s` getter中实例化。如果不是,则需要实例化它。然后返回常量的值。