为什么接口成员不能是非公共的?

4

可能是重复问题:
C#接口中的非公共成员

假设我有

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

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

我得到了这个错误提示:

未实现接口成员;无法实现接口成员,因为它不是公共的。

我知道如何解决,但我想知道为什么 C# 不允许接口成员为私有。

很多时候我希望我的类遵循某种模式,但又不需要将成员公开,比如在编写库时。更重要的是,接口本身并不是公共的:X

注意:我不是在问如何实现私有接口成员,而是想了解背后的设计逻辑。我找不到合适的重复问题。

更新:除原始线程外,来自答案的代码示例 在另一个线程中更好地解释了它,甚至更好的解释,来源于 @JonSkeet this


我正在发布一个答案,但是你的问题已经被关闭了 :( 你需要一个_显式_接口实现。要使用此功能,请在您要实现的成员前缀中加上接口名称。有关更多详细信息,请参见此帖子:如何使用显式接口实现实现接口而不使成员公开 - Paolo Moretti
@PaoloMoretti 我在询问设计决策,而不是如何实现。 - nawfal
你实际上是在询问C#语言设计者在编写第13.4.4节(接口映射)时的会议记录。如果你的问题只能由当天在场的人明确回答,那么你就必须找到当时在场的人。 - Paolo Moretti
@PaoloMoretti不需要。我只是想知道是否存在任何逻辑复杂性/歧义/愚蠢,考虑到我无法想到的非公共接口成员。是的,有一个例子,大多数人都无法解释。 - nawfal
2个回答

1

接口用于定义契约,如果将字段/方法设为私有,则使用接口就没有意义了。客户端如何知道如何使用契约呢? 除非您真的需要一个抽象类。


抽象类是否会强制编译器检查子类是否实现了父抽象类的所有成员? - nawfal
不幸地不得不接受这个答案。请查看我的更新以获得更好的解释。 - nawfal

1
接口的意义在于它们提供了其他对象与您的对象进行通信的契约。如果将成员设置为私有,那么这样做就没有任何用处了。

9
"private"并不是唯一的访问控制符。我特别询问的是"internal"。 - nawfal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接