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

Posted

技术标签:

【中文标题】您是不是有理由不能在方法或接口上定义访问修饰符?【英文标题】:Is there a reason you can not define the access modifier on a method or in an interface?您是否有理由不能在方法或接口上定义访问修饰符? 【发布时间】:2010-12-11 17:57:15 【问题描述】:

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

public interface IMyInterface

  bool GetMyInfo(string request);

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

是否有不能在方法或接口中定义访问修饰符的原因?

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

【问题讨论】:

Non Public Members for C# Interfaces的可能重复 【参考方案1】:

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

【讨论】:

你为什么跳过protected【参考方案2】:

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

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

【讨论】:

确实,如果在现实生活中,将电源线连接到显示器和计算机的物理接口任意丢失一些引脚(因为它们丢失/隐藏/私有)怎么办?它只是行不通。这就是为什么即使是虚拟接口也必须完全存在并公开。【参考方案3】:

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

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");

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

【讨论】:

+1 以获得额外的信息。但是,我一直不明白为什么或在什么情况下,这种行为是可取的(???)【参考方案4】:

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

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

【讨论】:

【参考方案5】:

接口中的私有定义将:

    对接口的用户没有任何好处(毕竟它是私有的) 约束实现类必须实现方法或属性 用实现细节混淆了接口的概念性质 就像一个带有私有方法的抽象类(这是不允许的)

【讨论】:

“private”修饰符可能没有用,但“internal”访问修饰符会有用。在某些情况下,人们希望允许外部代码传递对抽象类的引用,但不使用它的所有特性或创建可替代它的对象。在某些情况下,哪些类型的对象应该可以相互替换的图不是树,因此只能用接口建模,而不仅仅是继承。当这两种情况重叠时,内部接口方法会很有用。

以上是关于您是不是有理由不能在方法或接口上定义访问修饰符?的主要内容,如果未能解决你的问题,请参考以下文章

与接口相关的访问修饰符

为啥类或接口不能接收私有或受保护的访问修饰符?

JAVA 中的权限访问修饰符(public,protected,default,private )

java中protected方法和友好方法的区别

Java中的构造函数是不是有访问修饰符继承?

为啥我们不能在实现两个接口由相同方法组成的类的方法中使用访问修饰符?