您是否有理由无法在方法或界面中定义访问修饰符?

时间:2009-10-30 20:30:39

标签: c# interface access-modifiers

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

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

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

您是否有理由无法在方法或界面中定义访问修饰符?

(问题已经用法语here提出)

5 个答案:

答案 0 :(得分:14)

接口定义了一个对象和调用其成员的客户端之间的契约。任何其他对象都无法访问私有方法,因此将其添加到接口没有意义。由于这个原因,界面的所有成员都被视为公开。

答案 1 :(得分: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");

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

答案 2 :(得分:4)

就OO而言 - 封装是关于数据隐藏的。这意味着类中的任何内容都取决于类的实现。这意味着合同执行私人成员将毫无用处。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

界面中的私有定义:

  1. 对界面的用户没有任何好处(毕竟它是私有的)
  2. 约束实现类必须实现方法或属性
  3. 使用实施细节来理解界面的概念性
  4. 就像一个带有私有方法的抽象类(不允许)