【发布时间】:2015-10-03 09:41:21
【问题描述】:
所以这让我很困惑。
假设有两个接口。
public interface a
{
void foo();
}
public interface b
{
void foo();
}
这两个接口都有一个函数 foo,我有一个提供显式实现的类:
public class alpha : a, b
{
// why can't I put an access modifier here?
// How would you be able to hide this from a derived class
void a.foo()
{
Console.WriteLine("a");
}
void b.foo()
{
Console.WriteLine("b");
}
}
还有一个从 alpha 派生的类
public class beta : alpha
{
}
你如何将 foo 设为私有或受保护,因为 alpha 不允许在显式实施时使用访问修饰符,什么可以阻止某人调用:
var be = new beta();
(be as b).foo();
编辑
如果我不明确提供实现,我怎么可以提供访问修饰符?
public class alpha : a, b
{
//why this compile?
public void foo()
{
Console.WriteLine("both");
}
}
【问题讨论】:
-
你不能。这就是显式接口实现的工作方式。将对象转换为该特定的显式接口将公开成员。如果你不希望它被暴露,不要保证它在你的界面中。
-
没有办法隐藏实现,但是...您也可以在
b上显式实现foobeta,抛出异常... -
也许这是XY problem - 请告诉我们您为什么要在
beta上隐藏foo... -
请注意,在“显式提供实现我可以提供访问修饰符”-“可以”部分不完全正确-因为接口实现必须是
public或显式 隐式实现的唯一选择是“必须指定public”而不是“可以提供修饰符”。
标签: c# interface multiple-inheritance encapsulation access-modifiers