我正在尝试创建一个接口,其方法受到保护,或者仅对实现它的类可见。
问题是这个。我有两个类或多或少完全相同但具有不同参数和行为的类,但它所采取的实际步骤是相同的。
我在想,我有两个相似的类,所以让我们创建一个这两个类都实现的接口。应该没事吧?好吧。它完成了这项工作,但有一个严重的缺陷,All和我的意思是它在这两个类中所覆盖的所有方法现在都是肉眼可见的。
可以访问它们,因为它们被定义为“公共”。有封装:(
我想到的另一个解决方案是使用抽象类但是等待,你只能扩展一个抽象类,而我正在使用的两个类已经扩展了一个类(在我的例子中是一个android服务类),所以也是如此。
答案 0 :(得分:3)
这是对的。 interface
是类接口的定义,因此您不应该担心实现细节,例如接口的实现方式。甚至在受保护的方法方面都没有。
在大多数情况下,这可以通过使用抽象类来解决。如果你的两个实现已经扩展了另外两个不同的类,那么你可能需要在代码中“重复”一下。
虽然我不确定我在这里理解你的问题。当你说这些类在很多方面表现相同时,我假设你想在一个普通的超类中写这个行为,对吧?但是如果你想把它放在一个普通的超类中,那么这两个类必须扩展这个类。在这种情况下,你可以简单地做这个超类摘要,正如你所描述的那样,不是吗?我的意思是即使接口可以声明受保护的方法,您仍然无法在此接口中共享公共实现部分。
答案 1 :(得分:3)
如果您的两个类都在更好地扩展服务类,则声明一个抽象超类,而不是扩展Service类。所以你看到你不必担心继承结构以及方法的可见性。
答案 2 :(得分:0)
我不确定您的问题陈述是否正确:
我在想,我有两个相似的 所以让我们创建一个 这两个类的接口 实行。应该没事吧?好吧 是。它做的工作,但严重 瑕疵,所有,我的意思是所有的 这两种方法都凌驾于其中 现在可以看到裸体课程了 眼。
您定义的接口是实现类的公共“face”。除了要向呼叫者公开的方法之外,不要求接口中有任何内容,这些可以合理地公开。
那么你所说的“它覆盖的所有方法”是什么意思?接口不会覆盖任何东西,所以你的句子中的“它”是什么。我没有看到使用Interface如何暴露任何不需要暴露的东西。在概念标记中,受保护的接口只意味着类本身可以看到方法。我不知道这有多大用处。
也许您对接口 暴露的内容感到担忧。关键问题是谁正在使用该接口。您可以使用默认访问权限(既不公开也不私有)声明接口,因此限制在同一个包中的类。