【问题标题】:Is it possible that Different child classes have different visibility to the methods of the Parent in java是否有可能不同的子类对java中Parent的方法有不同的可见性
【发布时间】:2011-06-01 14:14:31
【问题描述】:

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

谢谢, 阿西特

【问题讨论】:

    标签: java design-patterns inheritance visibility


    【解决方案1】:

    你可以用接口做这样的事情,但不能用具体的类。

    【讨论】:

      【解决方案2】:

      我认为类是不可能的。要分离功能,您应该使用 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 等价物。

      【讨论】:

        【解决方案3】:

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

        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。

        methodB 是私有的,因此无法访问

        methodD 是包保护的,也就是说,仅限于同一个 packgae 中的类(一种奇怪的方式,相当于 C++ friend 关键字,我现在意识到),因此在 packgae first 之外不可见.

        【讨论】:

          【解决方案4】:

          不太明白你的意思……

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

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

          您不能限制类的可用性,即如果您的 A 类中的方法被“保护”,那么您可以将 B 类中的覆盖方法声明为“公共”。但反之则不行

          【讨论】:

            【解决方案5】:

            此答案基于您对术语子类
            简答否的使用
            更长的答案
            在这种情况下:
            类 Base 有以下方法:method1、method2、method3
            无法使用 Java 设置以下情况:
            类Derived1(该类扩展类Base)可以访问method1和method2,但不能访问method3。
            类 Derived2(该类扩展类 Base)可以访问方法 1、方法 2 和方法 3。
            两个类都在同一个包中。

            在 Java 中,当一个类扩展另一个类时,这些事情总是适用的:

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

            【讨论】:

              【解决方案6】:

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

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

              【讨论】:

                【解决方案7】:

                AdapterDecorator 模式将为您提供帮助。

                【讨论】:

                  猜你喜欢
                  • 2015-08-30
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-02-26
                  • 2018-05-27
                  相关资源
                  最近更新 更多