我知道virtual
和static
方法是相反的概念,但我认为有时将它们结合使用是有意义的。在这个主题上有很多关于SO的类似问题,但是还没有涉及以下场景。
有一个C#界面,如下所示:
interface IVertexMeshLoader
{
VertexMesh LoadFromFile(string fname);
}
实现可能如下所示:
class VertexMeshLoaderObj : IVertexMeshLoader
{
public VertexMesh LoadFromFile(string fname) { .. }
}
现在我希望能够在没有对象实例的情况下调用方法,但我无法使LoadFromFile()
方法成为静态,因为它实现了接口。
到目前为止,我制定的最佳解决方案是编写一个包含实际代码的静态方法LoadFromFileStatic()
。 LoadFromFile()
然后只是调用它。不是很漂亮,imho。
每次我想调用方法时,我也可以创建VertexMeshLoadObj
的实例,但情况更糟。
有更好的方法吗?谢谢: - )
答案 0 :(得分:3)
这是另一种选择。提供仅调用静态方法的接口的显式实现。它允许它们具有相同的名称
class VertexMeshLoaderObj : IVertexMeshLoader
{
VertexMesh IVertexMeshLoader.LoadFromFile(string fname) {
LoadFromFile(fname);
}
public static VertexMesh LoadFromFile(fname) {
...
}
}
答案 1 :(得分:0)
如果必须这样做,请创建IVertexMeshLoader的单例实例并访问
答案 2 :(得分:0)
即使您只对对象的vtable感兴趣而不是对实际成员感兴趣,也需要一个对象实例来知道要调用的方法。
因此,即使实际实现似乎并不依赖于实例,它实际上也是如此。
您不是使用“静态虚拟”方法,而是使用虚拟方法。