声明类属性受保护还是公共?

Posted

技术标签:

【中文标题】声明类属性受保护还是公共?【英文标题】:Declare Class Attribute Protected or Public? 【发布时间】:2011-10-11 13:50:06 【问题描述】:

我在包 com.practise.mypackageone.MyClass 中有一个班级

类 MyClass 有一个方法

 /* Modifier  */ void show()

 // some code here

我希望这个方法只能从另一个包类访问,比如说

com.practise.mypackagesecond.SecondClass

现在,如果我将方法公开,它可以在我不想要的任何地方访问。 如果我将其设为受保护,则 SecondClass 必须扩展 MyClass 才能访问它。

但是任何其他包类也可以扩展我的类来访问该方法。

我怎样才能防止这种情况发生?

【问题讨论】:

不可能...................... 【参考方案1】:

将类放在同一个包中,并将方法包设为私有(默认修饰符)。否则我认为你想要的是无法实现的。

【讨论】:

@peter 谢谢你的回复..我知道默认修饰符..问题是让它可用于其他特定的包。例如,我正在开发一个由几个包本身组成的库。不应允许将使用该库的客户端代码使用我的库包允许使用的某些特定方法。 这是不可能的。唯一的解决方案是我在回答中写的,但是这些类必须在同一个包中。【参考方案2】:

第一个包中的类可以从第二个包中扩展一个类,如下所示,它们可以根据需要实现 show() 方法:

    public static abstract class Showable 
        abstract protected void show();
    

如果第二个包中只有一个类(例如 ViewManager)需要调用此方法,您可能希望将这个 Showable 嵌入其中,以便只有该类可以调用 show() 方法。

虽然这不是一个非常干净的设计。

【讨论】:

即使第一类扩展了它并提供了一个特定的主体。即使这样,其他类也可以扩展第一个类,并且仍然可以访问该方法。 还有其他方法可以防止这种情况。将您的类设为最终类,或将构造函数设为“包私有”并使用工厂对其进行实例化。 如果类被声明为final,那么如果声明为protected,则没有其他包类可以访问该方法..hmmm @Javanator 我们在这里将不同的东西混合在一起。第一个问题是将方法公开给特定的包/类。问题 2 是通过扩展类来避免访问受保护的方法。

以上是关于声明类属性受保护还是公共?的主要内容,如果未能解决你的问题,请参考以下文章

通过公共方法访问受保护的属性

如何在 Mockery 中为受保护的属性存根公共设置方法

如何在 Python 类中表示受保护的方法?

C++ 派生类访问属性

Python - 访问类的受保护成员_

基类有没有办法在不污染 .h 文件的情况下声明受保护的变量?