不同的子类是否可能对java中的Parent方法具有不同的可见性

时间:2010-12-30 14:29:48

标签: java design-patterns inheritance visibility

不同的子类可能与父类的方法有不同的可见性。假设有一个A类,它定义了10个方法。它有两个不同的子ClassB和ClassC。 ClassB和ClassC是否可以访问ClassA的不同方法。像ClassB只能访问ClassA中定义的10个方法中的6个,而ClassC只能访问ClassA的其他4个方法吗? ClassB和ClassC在同一个包中。

谢谢, ASIT

7 个答案:

答案 0 :(得分:3)

我认为课程不可能。要隔离功能,您应该使用interfaces而不是扩展类。

如果你需要划分类似的方法,你的A类很可能违反了Single Responsibility Principal

然后使用composition instead of inheritance从更简单的类中组合复杂的类。另请查看strategy pattern

在这样的界面中划分你的功能 -

public interface IFlyable
{
    void FlapWings();

    void Fly();
}

public interface IHuntingAnimal
{
    void Hunt();
}

然后像这样实现你的类 -

public class Duck : IFlyable { ...

public class Eagle : IFlyable, IHuntingAnimal { ...

public class Tiger : IHuntingAnimal { ..

注意:示例在C#中。你需要计算出java等价物。

答案 1 :(得分:1)

您可以使用接口执行此类操作,但不能使用具体类。

答案 2 :(得分:1)

AdapterDecorator模式可以帮助您。

答案 3 :(得分:0)

从你写的,我想你拥有的是

package first;
class A {
    protected methodA() {...}
    private methodB() {...}
    public methodC() {...}
    methodD() {...}
}

package second;
class B extends A {...}
class C extends A {...}

在这种情况下,B和C只能看到A类方法methodA和methodC。

方法B是私有的,所以无法访问

方法D是受包保护的,也就是说限制在相同的packgae中的类(一种奇怪的方式来获得相当于C ++ friend的关键字,我现在意识到),因此在packgae之外不可见{ {1}}。

答案 4 :(得分:0)

不太明白你是什么意思......

通常,父类的方法可能具有不同的访问修饰符作为可能的固有类。但有一个条件(来自lang spec的引用):

覆盖或隐藏方法的访问修饰符必须至少提供与重写或隐藏方法一样多的访问权限,否则会发生编译时错误。

你无法改变一个类的可用性,即如果你的A类中的方法被“保护”,那么你可以在你的B类中声明一个重写方法为“public”。但它不起作用反之亦然

答案 5 :(得分:0)

这个答案取决于你使用术语 子类
简短回答没有
更长的答案
在这种情况下:
class Base有以下方法:method1,method2,method3
使用Java无法设置以下情况:
class Derived1(此类扩展类Base)可以访问method1和method2,但不能访问method3 class Derived2(此类扩展类Base)可以访问method1,method2和method3 两个类都在同一个包中。

在Java中,当一个类扩展另一个类时,这些东西总是适用:

  • 派生类可以调用基类的每个公共方法。
  • 派生类可以调用基类的每个受保护方法。
  • 派生类可能不会调用基类的任何私有方法。
  • 如果派生类与基类位于同一个包中, 派生类可以调用基类的每个包访问方法。

答案 6 :(得分:0)

我不知道你的问题的背景,所以我不能评论你的设计是否合理,并且通过扩展,你的动机是否合理。由于其他人已经采取了你的ClassA需要重构的立场,我将做相反的事情并假设它是一个明智的类,具有明确定义的目的,并且不需要细分。

在这种情况下,为什么不使用对象适配器模式来实现您所追求的目标?您可以通过实现将调用转发给ClassA适配器的包装器方法,在ClassB和ClassC适配器中公开您想要的ClassA方法。当然,您可以选择扩展这些方法。