【问题标题】:Do all static members defined in an interface have to be defined with default implementation?接口中定义的所有静态成员都必须使用默认实现来定义吗?
【发布时间】:2021-07-30 16:59:35
【问题描述】:

我最近一直在玩接口中的静态成员。特别是静态方法。我注意到,每当我在接口中定义静态方法时,我都有义务使用默认实现来定义它。否则会出现编译时错误CS0501。我想知道的是,接口中定义的所有静态成员是否必须使用默认实现来定义?还是这只适用于接口中定义的静态方法?

public interface IFoo
{
    public static void MethodFoo()
    {
       //implementation
    }
}

【问题讨论】:

  • 使用预览编译器我相信你可以制作方法abstract。或者也许这是一个普遍可用的东西
  • @gunr2171 “否”静态成员(除了静态方法之外)在接口中定义时没有义务使用默认实现来定义?
  • 你希望完成什么编译器不让你做的事情?
  • 如果您不提供静态方法的实现,您希望在哪里提供实现?在实现接口的类中提供实现会破坏使成员静态的目的。
  • 当你在一个接口上创建一个静态方法时,你并没有给它一个默认实现,你给它的是实现。 Default 实现仅适用于非静态事物。您不能继承静态成员,因此无法覆盖其行为。这适用于任何静态。

标签: c# interface static-methods


【解决方案1】:

是的,我必须在接口上实现静态成员,但这并不是真正的“默认实现”。静态成员是接口的成员,而不是实现类的成员。因此,您不能将实现“推迟”到实现类型。在接口上有一个静态成员并不意味着“实现者必须有这个静态成员”。

这适用于所有静态成员,而不仅仅是接口。静态成员不被继承,也不能被覆盖。

换句话说,你不能这样做:

interface IFoo{
   static virtual void Bar();
}

class Fizz : IFoo:
{
   static void Bar() {
      Console.WriteLine("In Fizz");
   }
}

Class Buzz : IFoo:
{
   static void Bar() {
      Console.WriteLine("In Buzz");
   }
}

如果可以,IFoo.Bar() 是什么意思?编译器如何知道绑定到什么方法?

【讨论】:

  • 在这种情况下,静态成员是用“实现”定义的。而非静态成员,包括使用私有可访问性级别定义的成员是使用“默认实现”定义的?
  • 如果一个非静态成员有一个实现,是的,那将是一个“默认”实现,这意味着实现者不必创建自己的实现。这个概念与静态无关,因为它们不是继承的。
  • 所以基本上因为静态成员的实现不能被覆盖它被认为是“实现”而不是“默认实现”?还是因为不能继承静态成员的实现?
  • 是的,尽管通常“实现”一词甚至不用于静态情况。更常见的说法是“静态方法,无论是在类还是接口中,都定义了自己的主体,因为没有其他东西可以提供它,因为静态方法不能被覆盖”。 (然而。They are considering virtual/abstract static methods,这只是让我头疼,但它还不是语言。)
  • @JoeSewell 我注意到定义一个空主体的静态方法仍然被认为是给它实现。但我认为代码实际上必须存在于分隔符 { } 中才能被认为具有实现的成员?
猜你喜欢
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2011-03-17
相关资源
最近更新 更多