【问题标题】:Why can't interface members be non-public? [duplicate]为什么接口成员不能是非公开的? [复制]
【发布时间】:2012-09-15 19:34:31
【问题描述】:

可能重复:
Non Public Members for C# Interfaces

假设我有

internal interface IInterface
{
    int MyProperty { get; set; }
}

public class MyClass : IInterface
{
    internal int MyProperty
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            throw new NotImplementedException();
        }
    }
}

我明白了:

没有实现接口成员;无法实现接口 成员,因为它不公开;

我知道解决方法是什么,但我想知道为什么 C# 不让接口成员私有。

我多次希望我的课程遵循某种模式,但不必将成员公开,例如在编写库时。最重要的是,接口本身是不公开的:X

注意:我不是在问如何实现私有接口成员,但我知道这个决定背后的设计逻辑。我找不到合适的副本。

更新:比原始线程更多,另一个线程中的this code sample from the answer 比大多数描述答案更好地解释了它。或者更好,来自@JonSkeet this

【问题讨论】:

  • 我发布了一个答案,但你的问题已经结束了 :( 你需要一个 explicit 接口实现。要使用这个功能,请在你正在实现的成员前面加上接口名称,详情见此贴:How to Implement an Interface Without Making Members Public Using Explicit Interface Implementation
  • @PaoloMoretti 我要求设计决策,不知道如何实现。
  • 在编写第 13.4.4 节(接口映射)时,您实际上是在询问 C# 语言设计者的会议记录。如果您的问题只能由当天在房间里的人明确回答,那么您将不得不找到那个房间里的人。
  • @PaoloMoretti 不需要。我知道在考虑我无法想到的非公共接口成员时是否存在任何逻辑复杂性/歧义/愚蠢。是的,here is one 大多数人都无法解释

标签: c# interface access-specifier


【解决方案1】:

接口用于定义合同,通过将字段/方法设为私有,那么使用接口确实没有意义。客户如何知道如何使用合同? 除非你真的需要一个抽象类。

【讨论】:

  • 如果子类没有实现父抽象类的所有成员,抽象类是否强制编译器错误检查?
  • 不幸地不得不接受这个答案。查看我的更新以获得更好的解释
【解决方案2】:

接口的意义在于它们提供了一个契约,其他对象可以使用该契约与您的对象进行通信。将成员设为私有是没有意义的,因为它不再有用了

【讨论】:

  • private 不是唯一的访问说明符。我特别要求“内部”
猜你喜欢
  • 2021-10-06
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多