【问题标题】:How can i implement a class using :Interface?我如何使用 :Interface 实现一个类?
【发布时间】:2012-01-01 20:05:30
【问题描述】:

我如何实现从一个类扩展为接口的方法?

我有这个接口:

public Interface myInterface
{
      public static int myMethod();
}

还有这个类:

public class MyClass : myInterface
{
       // And I want here to implement the method form myInterface and i don't know how
}

【问题讨论】:

标签: c# interface


【解决方案1】:

Interface 无法编译 - 将其更改为 interfacestatic 不能成为 interface 的一部分。

修改后的代码如下所示:

public interface myInterface
{
      int myMethod();
}

public class MyClass : myInterface
{
       public int myMethod()
       {
           return 1;
       }
}

关于staticinterface 参见http://channel9.msdn.com/forums/TechOff/250972-Static-Inheritance/?CommentID=274217 的引用:

.NET 中的继承仅适用于实例库。静态方法是在类型级别而不是在实例级别定义的。因此 覆盖不适用于静态方法/属性/事件...

静态方法只在内存中保存一次。没有为他们创建的虚拟表等。

如果您在 .NET 中调用实例方法,则始终为其提供当前实例。这被 .NET 运行时隐藏了,但它确实发生了。 每个实例方法都有一个指针(引用)作为第一个参数 运行该方法的对象。这不会发生在静态 方法(因为它们是在类型级别定义的)。应该怎么编译 决定选择调用的方法?

【讨论】:

  • +1 用于实际注意到方法签名中的静态(以及此问题)。
  • 界面中的public也会有问题。
【解决方案2】:

您错误地声明了您的界面。使用 interface 关键字指定的 C# 中的接口,在该精确大小写中。接口也不能包含静态方法。更多详情请参考Interfaces (C# Programming Guide)MSDN 文章。

【讨论】:

    【解决方案3】:

    第二次编辑:真丢脸。我在测试之前给出了这个答案,然后意识到我以前从未在接口中声明过静态方法。不支持,有一篇 SO 文章 here 涵盖了它

    忽略下面的答案...

    像往常一样简单地实现该方法:

    public Interface myInterface
    {
       static int myMethod();
    }
    
    //impl
    public class MyClass : myInterface
    {
       public static int myMethod()
       {
          //implementation here
       }
    }
    

    编辑:我曾说过这将使该方法可以从抽象或具体类的实例中调用,然后意识到我忘记了它是一个抽象方法...

    【讨论】:

    • 接口不能有静态方法。
    • 确实如此,因此第二次编辑解释了我的错误。也许我会把它移到帖子的顶部......
    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 2020-07-24
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多