为什么明确实施的成员不能公开?

时间:2012-04-15 17:34:40

标签: c# oop

  

可能重复:
  Why Explicit Implementation of a Interface can not be public?

I read this Question。直接问题

interface IRepository<T>
{
    void AddString();
}

interface IStringRepo : IRepository<string>
{
    List<string> GetStrings();
}

public class BLL : IStringRepo
{
    public List<string> FilterStrings()
    {
        return new List<string>() { "Hello", "World" };
    }

    public List<string> IStringRepo.GetStrings()
    {
        throw new NotImplementedException();
    }

    public void IRepository<string>.AddString()
    {
        throw new NotImplementedException();
    }
}

为什么明确引用的成员公开为Error

3 个答案:

答案 0 :(得分:1)

  

为什么将显式引用的成员公开为错误

这是设计理念,想象一下迫使开发人员明确实现接口的最常见原因之一: memeber name ambiguity ,所以你有一个现有的类已经公开了一些公共成员name,您不能更改现有的类API,因为它被其他系统使用,您也无法更改接口API(成员名称/签名),并且类和接口都定义了具有相同名称的成员,因此提供{{1由于已在类中声明了具有相同名称的成员,因此接口成员的acces修饰符没有意义。

MSDN,13.4.1 Explicit interface member implementations

  

无法访问显式接口成员   通过方法中的完全限定名称实现   调用,属性访问或索引器访问。一个明确的界面   成员实现只能通过接口访问   实例,并且在这种情况下仅由其成员名称引用。

     

显式接口成员是编译时错误   实现包含访问修饰符,它是一个编译时   包含修饰符abstract,virtual,override或static的错误。

答案 1 :(得分:0)

因为它们不公开所以它是一种冲突

您有choice实现任一方式 - 显式或隐式。

如果明确的话,通常是 因为实施者希望强迫您仅通过界面访问它,并以某种方式将其隐藏公开(简化) - 因此它不公开。

简而言之,这是明确实施的目的之一。

答案 2 :(得分:-1)

没有任何原因使其成为public,因为通过与之签订合同,您没有其他选择然后实现其所有成员,如公共

但为什么会出错呢?

因为根据定义,所有接口成员都是公共的。

Interfaces

  

接口由方法,属性,事件,索引器或任何组成   这四种成员类型的组合。界面不能包含   常量,字段,运算符,实例构造函数,析构函数或   类型。它不能包含静态成员。接口成员是   自动公开,并且不能包含任何访问修饰符。