为什么编程语言没有 'allow specific classes' 访问修饰符
Why programming languages don't have an 'allow specific classes' access modifier
如今,编程语言具有这些众所周知的访问修饰符:private、public、internal 和 protected。但有时当我以 OOP 方式编写程序时,我想我需要一个 'special' 修饰符,它可以手动指定 class 我想要允许访问的内容。
现在我想知道为什么语言设计者不在编程语言中添加这样的修饰符,可能是与OOP概念冲突,还是难度?
感谢您的回答:)
p.s。抱歉,如果已经有人问过同样的问题。
好吧,Scala 允许您限制访问 to specific packages or just to an instance of a class you're referring to as 'this'
C#和VB.Net都有friend assemblies的概念,指定程序集可以访问指定程序集的内部成员。这允许您为特定调用者提供临时访问权限,对此的检查是在编译时完成的。
Only assemblies that you explicitly specify as friends can access Friend (Visual Basic) or internal (C#) types and members. For example, if assembly B is a friend of assembly A and assembly C references assembly B, C does not have access to Friend (Visual Basic) or internal (C#) types in A.
现实情况是,此功能的合法用途有限(至少在这些语言中),除非您正在开发臭代码。
但话虽如此,class 定义谁可以调用它的想法是违反 OOP 的封装和抽象规则的临界点。通过允许 class 指定谁是呼叫者,您可以允许 class 拥有超出其领域的知识,并且您正在将好的设计丢给 window。 class 可以指示呼叫者 如何 呼叫,但不能指示 谁 应该呼叫。
我希望这能有所帮助 - 就我个人而言,我期待更多面向学术语言的人的回答。
这正是 C++ 中的 friend
修饰符所做的。
如今,编程语言具有这些众所周知的访问修饰符:private、public、internal 和 protected。但有时当我以 OOP 方式编写程序时,我想我需要一个 'special' 修饰符,它可以手动指定 class 我想要允许访问的内容。
现在我想知道为什么语言设计者不在编程语言中添加这样的修饰符,可能是与OOP概念冲突,还是难度?
感谢您的回答:)
p.s。抱歉,如果已经有人问过同样的问题。
好吧,Scala 允许您限制访问 to specific packages or just to an instance of a class you're referring to as 'this'
C#和VB.Net都有friend assemblies的概念,指定程序集可以访问指定程序集的内部成员。这允许您为特定调用者提供临时访问权限,对此的检查是在编译时完成的。
Only assemblies that you explicitly specify as friends can access Friend (Visual Basic) or internal (C#) types and members. For example, if assembly B is a friend of assembly A and assembly C references assembly B, C does not have access to Friend (Visual Basic) or internal (C#) types in A.
现实情况是,此功能的合法用途有限(至少在这些语言中),除非您正在开发臭代码。
但话虽如此,class 定义谁可以调用它的想法是违反 OOP 的封装和抽象规则的临界点。通过允许 class 指定谁是呼叫者,您可以允许 class 拥有超出其领域的知识,并且您正在将好的设计丢给 window。 class 可以指示呼叫者 如何 呼叫,但不能指示 谁 应该呼叫。
我希望这能有所帮助 - 就我个人而言,我期待更多面向学术语言的人的回答。
这正是 C++ 中的 friend
修饰符所做的。