我已經實現了一個接口IService
,該接口繼承了一系列其他接口的功能,並作爲許多不同服務的共同點。通過接口擴展功能
每個服務是由一個接口描述,例如:
public interface IServiceOne : IService
{
//...
}
public class ServiceOne : IServiceOne
{
//...
}
一切到這一點,按預期工作:
IServiceOne serviceOne = new ServiceOne();
IServiceTwo serviceTwo = new ServiceTwo();
我現在要做的是增加一個大的常量列表(公共變量)到這些服務中的每一個,然而根據服務類型會有所不同(例如,IServiceOne
將具有不同於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
類,但是然後你不能通過接口暴露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
例外,因爲.Const
爲空。
我在這裏錯過了什麼?
爲什麼你想使用的接口類型混凝土IMPL拉常數? –
@cottsak我只能調用具體實現作爲它的超級接口類型,因爲我需要這個超級接口派生出來的接口的功能,最重要的是我需要爲這個超級接口添加一些額外的功能,這是不同的根據每種具體類型的基礎類型。 –
在這裏使用抽象類而不是接口可能更合適。 –