2010-12-11 173 views
2

也许我失去了一些东西,但不应该C#有方法的外部访问修饰符?即一个修饰符,使方法公开,但只为其他类,即方法不能被类本身调用?为什么没有“外部”访问修饰符?

对于诸如公共方法这样的事情来说,这不会有用吗?这些公共方法可以通过锁定来确保锁定不会从类中重新获取?

+0

有一个'extern'关键字,但它不用于你描述的。 http://msdn.microsoft.com/en-us/library/e59b22c5%28v=vs.80%29.aspx – Nobody 2010-12-11 15:59:20

+9

这只对有多重人格障碍的程序员有用。如果你想要一个类不可访问的方法,把它们放在一个不同的类中。通过设计,oop类应该可以访问和控制类中包含的方法和数据。 – ja72 2010-12-11 16:22:50

回答

5

显式实现的接口方法可能是最接近你想要的。当然,如果一个类将this转换为接口类型,它仍然可以自己调用它们。

+0

其实,我认为其他答案比较好。我打算大肆宣传你不应该需要这种行为,但是提出一个聪明的解决方案的诱惑太大了。 – siride 2010-12-11 16:43:43

+0

[Progress](http://msdn.microsoft.com/en-us/library/hh193692.aspx)和[IProgress](http://msdn.microsoft.com/zh-cn/library/hh138298.aspx )接口是一个很好的使用这个的好例子。 'IProgress .Report'是一个私人成员,所以创建'Progress '类的任何人都不会看到Report()方法,但所有接受'IProgress接口'的用户都可以调用Report() '回电话的方法。 – 2013-07-03 14:09:41

3

我认为这没有用。没有定义任何需求的范例。

在你的例子中:即使有external关键字你如何确保在不释放锁的情况下不能在外部重新输入锁?

类之间有合同,而且类总是与自己签订合同。我认为没有关键字可以帮助避免这种编程错误。在这个特定的例子中,类应该根据其使用级别适当地实现锁定。

+0

我不知道,我认为语法澄清代码的意图,并确保某些行为通常是一件好事,这就是为什么我们有像readonly关键字的东西。没有理由为什么一个班级不能与自己签订“合同” – Homde 2010-12-12 17:00:15

8

不需要它。访问控制用于限制对来自不受信任的客户端代码的成员的访问。

请记住,在OOP中,一个类表示一个自主的,自包含的代码单元,并且隐含地假定它是自洽的。

如果你不能相信自己班里的代码不会导致重入,那么你可以信任什么?用语言特征来防范每一种可能的可能性是不切实际的;有时它只是作为开发人员来确定你自己的代码的工作:)