5

方法可见性的责任归于实现接口的类。

public interface IMyInterface
{
  bool GetMyInfo(string request);
}

在 C# 中,在 GetMyInfo() 方法之前设置访问修饰符 public、private 或 protected 会产生以下错误:修饰符 'private' 对此项无效。

您是否有理由不能在方法或接口上定义访问修饰符?

(这里已经用法语问过问题)

4

5 回答 5

14

该接口定义了对象和调用其成员的客户端之间的契约。任何其他对象都无法访问私有方法,因此将其添加到接口是没有意义的。因此,接口的所有成员都被视为公共的。

于 2009-10-30T20:34:23.380 回答
10

如果您进行显式接口实现,您实际上可以在实现类中将方法设为私有:

public interface IMyInterface
{
    bool GetMyInfo(string request);
}

public class MyClass : IMyInterface
{
    public void SomePublicMethod() { }

    bool IMyInterface.GetMyInfo(string request)
    {
        // implementation goes here
    }
}

这种方法意味着GetMyInfo不会成为MyClass. 它只能通过将MyClass实例转换为来访问IMyInterface

MyClass instance = new MyClass();

// this does not compile
bool result = instance.GetMyInfo("some request"); 

// this works well on the other hand
bool result = ((IMyInterface)instance).GetMyInfo("some request");

因此,在接口的上下文中,它的所有成员都是公共的。它们可以从实现类的公共接口中隐藏,但总是有可能将类型转换为实例并以这种方式访问​​成员。

于 2009-10-30T20:53:50.843 回答
4

就 OO 而言 - 封装就是数据隐藏。这意味着类中发生的任何事情都取决于类的实现。这意味着以合同方式强制执行私人成员将毫无用处。

但是,使用接口的原因是因为您希望确保一个类遵守特定的约定并以一致的方式公开多个公共成员。

于 2009-10-30T20:37:35.730 回答
1

接口的所有方法必须具有相同的访问级别——以便调用者可以使用所有方法。但是接口也可以是内部的(或作为嵌套接口私有)。

如果您需要不同的访问级别,请使用不同的界面。

于 2009-10-30T21:07:15.653 回答
0

接口中的私有定义将:

  1. 对界面的用户没有任何好处(毕竟它是私有的)
  2. 约束实现类必须实现方法或属性
  3. 用实现细节混淆了接口的概念性质
  4. 就像一个带有私有方法的抽象类(这是不允许的)
于 2009-10-31T17:09:29.477 回答