直奔问题:我有一个实现两个接口的类:
public class A : Interface1, Interface2{
// Interface 1 implementation...
// Interface 2 implementation...
}
有没有一种方法(不需要创建另一个新类)使Interface1实现成为内部的,并对其他组件隐藏它(只有Interface2将保持公共)?
编辑:一些更有用的信息:Interface1
和Interface2
在另一个核心组件中被定义为公共的,并且不能更改。
提前谢谢你,
发布于 2011-11-23 00:32:18
虽然您可以将接口本身设置为内部接口,但这些方法仍然是公共API的一部分。您可以选择显式的接口实现,以便接口定义的API只能通过接口可见,而不能通过类可见。
interface IFoo
{
void M();
}
interface IBar
{
void X();
}
public class Bar : IBar, IFoo
{
public void X() // part of the public API of Bar
{
}
void IFoo.M() // explicit implementation, only visible via IFoo
{
}
}
Bar bar = new Bar();
bar.X(); // visible
bar.M(); // NOT visible, cannot be invoked
IFoo foo = bar;
foo.M(); // visible, can be invoked
除此之外,如果您需要让世界永远不知道类支持接口,那么您只需要不让类实现接口即可。接口用于广播给定对象支持给定行为的意图,显式或非显式。如果这不是你想要的,你需要换个方向。它可以简单地将行为实现为私有的实现细节,sans接口。另一种方法是将这些实现放入私有嵌套类中。
public class Bar : IBar
{
Foo foo = new Foo();
public void X() { }
public void DoSomething()
{
this.foo.M(); // invokes method of instance of nested class
}
class Foo : IFoo
{
public void M() { }
}
}
在这种方法下,世界永远不会知道一个类是否履行了接口契约,因为从技术上讲它不会。契约是由Foo
来履行的,并且世界看不到Foo
。但是,好处是,如果类需要调用需要接口的外部定义的方法,它仍然可以将嵌套的类实例传递给这些方法。
发布于 2011-11-23 02:16:00
无法将强制转换操作限制在接口上。但是,您可以提供一个实现接口的包装类,但该类通常是不可用的。
例如:
public class Foo
{
private IFoo wrap = new WrapFoo(this);
internal IFoo GetIFoo()
{
return wrap;
}
private class WrapFoo : IFoo
{
public WrapFoo(Foo parent)
{
//Save parent
}
public void DoSomething()
{
//Implement interface
}
}
}
另一种更复杂的方法是使用代码签名来验证调用者是否是库,否则抛出异常。
https://stackoverflow.com/questions/8230179
复制相似问题