静态方法不能实现接口方法,为什么?接口IXXX{voidFoo();}classXXX:IXXX{publicstaticvoidFoo(){Console.WriteLine("FromXXX");}}classProgram{staticvoidMain(string[]args){XXX.Foo();}}编译器错误:XXX.Foo()无法实现接口成员,因为它是静态的。为什么静态方法不能实现接口方法?请参阅JoelOnSoftware的这篇文章,其中描述了其背后的原因。基本上,接口是消费者和提供者之间的契约,静态方法属于类,而不是类的每个实例。之前关于SO的问题也涉及完全相同的问题:Whydoesn'tC#allowstaticmethodstoimplementinterfaces?接口定义对象必须响应的行为。由于Foo是静态方法,因此对象不会响应它。换句话说,你不能写...XXXmyXXX=newXXX();我的XXX。富();换句话说,myXXX并不完全满足接口。如果我们把接口看作是一个对象可以执行接口中列出的方法的承诺,那么静态实现的想法就变得有问题了。如果实现是静态的,则无法编写newImplementingObject()。实施方法。对象不能执行方法,类可以。您使用接口来避免在实例化期间使用具体类。您不能通过实例化类来访问静态方法,因此不允许使用静态方法实现接口方法。好吧,我相信在泛型类型参数的情况下应该允许这样做。它可能简化了契约单例类。这是一个例子:publicinterfaceIEntity{//一些约束...DataRowObjToRow(objectobj);对象RowToObj(DataRow博士);}//T将是从IEntity继承的具有默认构造函数签名的任何类。publicinterfaceIMyContract{Tread()whereT:IEntity;voidwrite(Tobject)whereT:IEntity;}//类中的所有内容都是静态的publicstaticclassSqlProvider:IMyContract{publicstaticTread()whereT:IEntity{DataRowdr=[从数据库读取]returnT.RowToObj(dr);}//这里编译错误....publicstaticvoidwrite(Tobj)whereT:IEntity{DataRowdr=T.ObjToRow(obj);[...将数据行dr提交到数据库...]}}publicstaticclassMyAppleEntity:IEntity{[...正常执行IEntity合同...]}publicstaticclassMyOrangeEntity:IEntity{[...执行IEntity合同通常...]}publicclassMyTest{voidreading(){MyAppleEntityapple=SqlProvider.Read();MyOrangeEntityorange=SqlProvider.Read();SqlProvider.write(苹果);SqlProvider.write(橙色);隐含类型引用的唯一时间是在SqlProvider.read()中,而write()和T在调用时被很好地识别。如果没有静态接口实现,我只好这样写了。publicclassMyAppleEntity:IEntity{[...正常执行IEntity契约...]}.....publicTread()whereT:IEntity,new(){DataRowdr=[从数据库读取]returnnewT().RowToObj(博士);差异很小但不是很优雅。因为接口成员是公共的并且可以被重写,而静态方法不能被设计重写或抽象,所以这里的接口定义了一个可访问性契约,必须由它们的具体实现(具有抽象实现和许多接口步骤之间的继承)来实现,并且尽可能据我所知,无法创建抽象静态方法。以上就是C#学习教程:静态方法不能实现接口方法,为什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
