可能重复:
为什么C#不允许静态方法实现接口?
在我的应用程序中,我想使用一个将执行原始数据访问的存储库(TestRepository,SqlRepository,FlatFileRepository等).因为这样的存储库将在我的应用程序的整个运行时间中使用,所以对我来说这是一个明智的事情,让它成为一个静态的类,所以我可以去
SqlRepository.GetTheThingById(5);
Run Code Online (Sandbox Code Playgroud)
没有它必须一直重生.因为我希望我的存储库可以互换,所以我想它们实现一个通用接口:IRepository.但是当我尝试这样做时,我明白了
"Static classes cannot implement interfaces"
Run Code Online (Sandbox Code Playgroud)
他们为什么不能?你怎么建议我改变我的设计呢?有没有我可以使用的模式?
更新
五年后:这个问题被访问了20k +次,我了解了存储库模式的缺点,了解了IoC,并意识到我的问题制定得很差.
我真的不是在问接口的C#规范是什么,而是为什么它故意以这种特定的方式限制我.
实际的答案是,在实例或类型上调用方法的语法是不同的.但这个问题已经结束了.
我有一个第三方C++ DLL,我从C#调用.
这些方法是静态的.
我想抽象它来做一些单元测试,所以我创建了一个带有静态方法的接口,但现在我的程序错误:
修饰符'static'对此项无效
MyMethod cannot be accessed with an instance reference; qualify it with a type name instead
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这种抽象?
我的代码看起来像这样
private IInterfaceWithStaticMethods MyInterface;
public MyClass(IInterfaceWithStaticMethods myInterface)
{
this.MyInterface = myInterface;
}
public void MyMethod()
{
MyInterface.StaticMethod();
}
Run Code Online (Sandbox Code Playgroud) 受到F#中的度量单位的启发,尽管断言(这里)你无法用C#做到这一点,但我还有一个想法,那就是我一直在玩的.
namespace UnitsOfMeasure
{
public interface IUnit { }
public static class Length
{
public interface ILength : IUnit { }
public class m : ILength { }
public class mm : ILength { }
public class ft : ILength { }
}
public class Mass
{
public interface IMass : IUnit { }
public class kg : IMass { }
public class g : IMass { }
public class lb : IMass { }
} …Run Code Online (Sandbox Code Playgroud) 什么时候在方法签名上使用Java中的static关键字被认为是不好的做法?如果方法基于某些参数执行函数,并且不需要访问非静态的字段,那么您是否总是希望这些类型的方法是静态的?
我有一个抽象类-let说myBase.我希望从myBase派生的所有类都有一个名为的静态字段
public static List<string> MyPArameterNames
{
get {return _myParameterNames;}
}
Run Code Online (Sandbox Code Playgroud)
因此,每个子类都可以告诉它使用哪些参数名称; 我想要静态,因为我不想为此创建一个实例.
我怎样才能做到这一点?
interface IXXX
{
void Foo();
}
class XXX : IXXX
{
public static void Foo()
{
Console.WriteLine("From XXX");
}
}
class Program
{
static void Main(string[] args)
{
XXX.Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
编译器错误:XXX.Foo()无法实现接口成员,因为它是静态的.
为什么静态方法不能实现接口方法?
据我所知,你不能在接口体中声明静态方法.但是,我不小心在http://docs.oracle.com/网站上发现了一些特殊的代码.这是链接
Namelly
public interface TimeClient
{
void setTime(int hour, int minute, int second);
void setDate(int day, int month, int year);
void setDateAndTime(int day, int month, int year,
int hour, int minute, int second);
LocalDateTime getLocalDateTime();
static ZoneId getZoneId (String zoneString) {
try {
return ZoneId.of(zoneString);
} catch (DateTimeException e) {
System.err.println("Invalid time zone: " + zoneString +
"; using default time zone instead.");
return ZoneId.systemDefault();
}
}
default ZonedDateTime getZonedDateTime(String zoneString) {
return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
}
} …Run Code Online (Sandbox Code Playgroud) 为什么我们不能在界面内定义静态方法?
如何在Visual Studio中打开C# 预览功能?
“可空引用类型”功能当前在“预览”中,“不支持”。要使用预览功能,请使用“预览”语言版本。