C# 具体类如何隐藏其实现的接口的成员
我将给出一个来自.NET的示例C# 具体类如何隐藏其实现的接口的成员,c#,.net,C#,.net,我将给出一个来自.NET的示例 ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IDictionary ConcurrentDictionary:IDictionary,IDictionary 这里您可以看到ConcurrentDictionary实现字典接口。但是,我无法从ConcurrentDictionary实例访问Add方法。这怎么可能 IDictionary<int, in
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
。显式接口实现是私有的,所以不,您的假设是不正确的。