【问题标题】:How to avoid multiple inheritance?如何避免多重继承?
【发布时间】:2016-12-13 15:05:37
【问题描述】:

对于一个项目,我有以下课程:

  • 超类
  • 子类 1
  • 子类 2

两个子类扩展了超类。 现在,我需要具有子类 1 和子类 2 的 EXACT 行为(读取,相同的覆盖方法实现)的第三个类。 因为子类 1 只覆盖了 SuperClass 中的 1 个方法,而子类 2 并没有覆盖那个方法,所以我想让第三个类继承父类,然后用子类 1 和子类 2 的方法来实现它。现在,这样好吗 OO-设计?我看不到其他解决方案,因为 Java 中的多重继承是不可能的。有没有其他选择?

【问题讨论】:

  • 优先组合优于继承...
  • 查看类定义以及如何使用它们来判断它是否是好的设计会很有用

标签: java inheritance polymorphism


【解决方案1】:

Java8 为接口引入了 defaultstatic 方法。在某种程度上,这允许多重继承。但最有可能的是,正确的解决方案是重新设计您的设计。

你看,继承不是代码重用。它是关于创建有用的抽象;例如,善用多态性。

在您的情况下:也许这些功能可以/应该放入更小的接口中;然后被隔离成他们自己独立的班级。然后你使用对象的组合而不是继承来构建你需要的东西。

【讨论】:

    【解决方案2】:

    这是一个使用 Java 8 的默认方法的示例,如 @GhostCat 所述。我认为这种面向对象设计本身没有任何问题。它是否适合您的用例取决于您要解决的问题的详细信息。

    public class Main {
    
        public static void main(String... args) {
            SuperClass sc = new SubClass3();
            sc.foo();  // overridden foo
            sc.bar();  // overridden bar
        }
    
        interface SuperClass {
            default void foo() {
                System.out.println("default foo");
            }
            default void bar() {
                System.out.println("default bar");
            }
        }
    
        interface SubClass1 extends SuperClass {
            @Override
            default void foo() {
                System.out.println("overridden foo");
            }
        }
    
        interface SubClass2 extends SuperClass {
            @Override
            default void bar() {
                System.out.println("overridden bar");
            }
        }
    
        static class SubClass3 implements SubClass1, SubClass2 {}
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 2019-02-04
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多