Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具体类如何隐藏其实现的接口的成员_C#_.net - Fatal编程技术网

C# 具体类如何隐藏其实现的接口的成员

C# 具体类如何隐藏其实现的接口的成员,c#,.net,C#,.net,我将给出一个来自.NET的示例 ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IDictionary ConcurrentDictionary:IDictionary,IDictionary 这里您可以看到ConcurrentDictionary实现字典接口。但是,我无法从ConcurrentDictionary实例访问Add方法。这怎么可能 IDictionary<int, in

我将给出一个来自.NET的示例

ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IDictionary
ConcurrentDictionary:IDictionary,IDictionary
这里您可以看到ConcurrentDictionary实现字典接口。但是,我无法从ConcurrentDictionary实例访问
Add
方法。这怎么可能

IDictionary<int, int> dictionary = new ConcurrentDictionary<int, int>();
dictionary.Add(3, 3); //no errors

ConcurrentDictionary<int, int> concurrentDictionary = new ConcurrentDictionary<int, int>();
concurrentDictionary.Add(3, 3); //Cannot access private method here
IDictionary dictionary=新的ConcurrentDictionary();
增加(3,3)//没有错误
ConcurrentDictionary ConcurrentDictionary=新的ConcurrentDictionary();
concurrentDictionary.Add(3,3)//无法在此访问私有方法
更新:


我知道如何访问它,但我不知道显式实现接口可以允许将访问修饰符更改为内部。但它仍然不允许将其私有化。这是正确的吗?对这一部分作更详细的解释会有所帮助。另外,我还想了解一些有效的用例。

这是通过显式接口实现完成的

public interface ISomeInterface
{
    void SomeMethod();
}

public class SomeClass : ISomeInterface
{
    void SomeInterface.SomeMethod()
    {
        // ...
    }
}
现在,当您有一个对
SomeClass
对象的引用时,您将看不到可用的
SomeMethod
方法。为了调用它,您必须将对象投射回
接口

((ISomeInterface)mySomeClass).SomeMethod();

这是C#imo的一个未充分利用的有用特性,因为
IDictionary.Add
方法是通过ConcurrentDictionary实现的

要从类中访问它而不必将变量声明为IDictionary,请将其强制转换到所需的接口:

((IDictionary)concurrentDictionary).Add(3, 3)
它被实现为,这意味着您需要一个
IDictionary
类型的变量来访问它

请参阅“显式接口实现”部分下的文档

如果将并发字典强制转换为
IDictionary
,则可以在其上调用
Add


我不知道显式实现接口可以允许将访问修饰符更改为内部。但它仍然不允许将其私有化。这是正确的吗

不,这是不对的


显式接口实现不会更改访问修饰符。它们改变了您访问以这种方式实现的成员的方式(即要求您使用接口类型的变量)。它们仍然是公共成员,但只能使用接口类型而不是实现类型来访问。

显式接口实现。举一个简单的例子:

public interface IFoo {
    void Bar();
}
public class Foo : IFoo {
    void IFoo.Bar() { ... }
}

这里,
Bar
不在
Foo

的公共API上,接口是显式实现的。在下面的示例中,您不能使用类的实例访问
Add
方法

public interface IA
{
    void Add();
}

public class A : IA
{
    void IA.Add()
    {
        throw new NotImplementedException();
    }
}

访问修饰符尚未更改
ConcurrentDictionary
已通过显式接口实现定义了方法
IDictionary.Add
,但尚未实现方法
Add

如果查看,您将看到不存在
Add
方法(因此
concurrentDictionary.Add(3,3);
类似于调用
concurrentDictionary.MethodThatThatThatsNodeList(3,3);
)。但是,在下,您可以看到有方法
ICollection.Add
IDictionary.Add


此功能允许一个类实现多个共享方法名称的接口,而不要求每个接口的实现都相同。

感谢everbody提供了非常好的答案,其中一个已删除的答案让我对访问修饰符感到困惑。我能够从相关的问题中找到一些很好的解释

迈克尔·霍普克罗夫特

乔恩·斯凯特

布拉德·艾布拉姆斯


&by Eric Lippert

显式接口实现不会更改访问修饰符。它们改变了您访问以这种方式实现的成员的方式(即要求您使用接口类型的变量)。有关用法的一些注释,请参阅。在java中,类内的默认可见性级别是
private
而不是
package
。显式接口实现是私有的,所以不,您的假设是不正确的。