![](/img/trans.png)
[英]C# Static method in interface cannot be accessed from the implementing class
[英]Static/singleton interface implementing class in C#
我有一個( 現在 )是靜態的類:
public static class Grob
{
public static void Frob()
{
Foo.Bar();
}
}
而且效果很好。 代碼調用:
Grob.Frob();
世界一切都正確。 現在我希望我的班級實現一個接口:
public static class Grob : IOldNewGrob
{
public static void Frob()
{
Foo.Bar();
}
}
不幸的是,由於原因 ,這不起作用。
所以我會嘗試將類更改為單例 :
public sealed class Grob
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Grob() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
除了行不通之外,它行之有效-代碼不再編譯:
Grob.Frob();
用其他語言,這將不是問題。 我將創建一個全局Grob
函數(稱為Grob
因為這是現有代碼所需的名稱):
function Grob(): GrobSingleton;
{
return Grob.Instance;
}
//and rename Grob class to something else
public sealed class GrobSinglton
{
...
}
除了C#沒有全局功能。
到底:
我只希望一切正常。
為什么不創建一個單身也有一個靜態Frob
方法?
public sealed class Grob : IOldNewGrob
{
private static readonly Grob instance = new Grob();
public static Grob Instance { get { return instance; } }
// Prevent external instantiation
private Grob() {}
public static void Frob()
{
Foo.Bar();
}
// Implement IOldNewGrob here
}
您可能還應該閱讀我有關在.NET中實現單例模式的文章 -確實不需要實現易碎的雙重檢查鎖定模式。
這滿足了使Grob.Frob()
工作並使Grob
實現接口的兩個要求。 尚不清楚這些是否是您唯一的要求-您尚未真正解釋為什么要這樣做-單例或接口進入的位置。
編輯:如果想法是Frob
是Frob
的成員, IOldNewGrob
可以使用如下所示的顯式接口實現:
public sealed class Grob : IOldNewGrob
{
private static readonly Grob instance = new Grob();
public static Grob Instance { get { return instance; } }
// Prevent external instantiation
private Grob() {}
public static void Frob()
{
// Implementation
}
// Explicit interface implementation to prevent name collisions
void IOldNewGrob.Frob()
{
// Call the static implementation
Frob();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.