Java 我们怎样才能摆脱不必要的继承?

Java 我们怎样才能摆脱不必要的继承?,java,oop,Java,Oop,在我完成的面试中,我有一个问题,我得不到正确的答案 假设我们有3个类,基,导数1和导数2, 它们之间的关系如下所示 public class Base {...} public class Derivate1 extends Base {...} public class Derivate2 extends Derivate1 {...} 然后我们发现导数1和导数2对于我们的程序来说是不必要的,但是它们的方法实现是有用的。那么,我们如何摆脱导数1和导数2,但仍然保留它们的方法呢?在这种情况

在我完成的面试中,我有一个问题,我得不到正确的答案

假设我们有3个类,基,导数1和导数2, 它们之间的关系如下所示

public class Base {...}

public class Derivate1 extends Base {...}

public class Derivate2 extends Derivate1 {...}
然后我们发现导数1和导数2对于我们的程序来说是不必要的,但是它们的方法实现是有用的。那么,我们如何摆脱导数1和导数2,但仍然保留它们的方法呢?在这种情况下,我们希望用户不能创建派生1和派生2的新实例,但他们仍然可以使用派生1和派生2中的方法实现。当然,我们可以在类基中更改代码

你是怎么想的?你能说出他们到底在问什么吗

非常感谢

附言

当我讨论这些问题时,面试官会给我一些提示

  • 派生类来自第三方。它们的设计很糟糕,所以我们不希望客户端使用它们,这意味着用户不应该允许从派生类创建实例

  • derviate类包含对基类有用的重写方法,我们可以在基类中创建具有不同名称的方法,以在derviate类中实现这些有用的行为


谢谢你所有这些有趣的答案…

我想他们的意思是提取接口的派生词

简单的重构:

  • 将所有代码从
    derivite1
    derivite2
    复制到
    Base
  • 删除
    派生类1
    派生类2
  • 确保没有缺少引用(如果您已经将
    派生
    对象的指针作为
    ,那么您应该很好)
  • 编撰
  • ""
  • 利润
    即使在层次结构中有更多的子类,例如
    developerate3
    developerate4
    ,让它们扩展
    Base
    (非静态)也应该没有问题只有当我们创建
    Derivate1
    Derivate2
    实例时,
    Derivate1
    Derivate2
    中的方法才可用。创建
    Base
    实例(如
    newbase()
    )不会授予对子类中声明的(非静态)方法的访问权

    因此,为了保留这些方法,可以将它们添加(重构)到
    Base
    类中。如果我们只是不希望子类使用公共构造函数,而是保持对象图的原样,on可以使用工厂模式按需创建它们。但即使在这种情况下,也必须将工厂返回的对象强制转换为
    派生1
    派生2
    以使用(非静态)方法


    我想我知道他们想听的是什么,普遍的建议是“重组合轻继承”。因此,与其说派生词1是一个基数,不如说派生词1是一个基数:

    public class Derivate1 {
      private Base base;
    
      // ... more
    }
    
    public class Derivate2 {
      private Derivate1 derivate1;
    
      // ... more
    }
    

    不再继承,两个派生仍然可以使用它们以前的超类的方法。

    如果有意义,可以直接将这些方法包括在基类中。当然,这取决于这个类的含义。如果可能,您可以在实用程序类中使用静态方法。顺便说一句,在这两种情况下,您的开发人员都必须更改他们对API的使用。

    第一件显而易见的事情是层次结构中的每个类都是具体的-一般来说,类型应该是抽象的,或者是叶类型。其次,关于这些方法是什么,没有足够的信息——如果它们覆盖Base或Derived1中的某些内容,则无法将它们移动到Base中;如果它们是应用于任何基的实用方法,那么它们可能被移动到基中,如果它们独立于基,那么它们可能被移动到帮助器类或策略中


    但我会质疑这样一种观点,即类不是必需的,但它的行为是——这在某种程度上意味着提问者正在考虑设计一个本体而不是一个面向对象的程序——类存在的唯一原因是提供行为,一致地封装有用的行为是类存在的充分必要条件

    我们可以做两件事:

    • 我们可以把
      派生1
      派生2
      的一些方法拉到
      Base
      ,只要这样做有意义(如上所述)
    • 我们可以使
      派生1
      派生2
      抽象
      :这可以防止实例化,但不能防止继承

    根据他们给您的提示,我认为答案是适配器模式,它有时用于遗留代码

    您可以在此处查看:


    由于您不拥有派生类,因此无法删除它们。基类都是你的,所以你有控制权。客户是你的,所以你有控制权。因此,最好的方法是拥有一个向客户机公开的全新类。这个类本质上创建派生实例(注意:您的客户端不再处理它)并使用它们的有用功能。

    Ctrl+C Ctrl+V进入您的
    Base
    类?@nil。。。不要忘记,该方法可能会使用在子类上声明的字段。所以可能需要稍微多做些努力…对不起,我忘了说派生1和派生2是由其他人扩展的,这意味着这两个类是不允许更改的。我想。。。所以,即使我们进行复制粘贴,我们仍然无法利用现有的继承。如果类方法有用,这意味着类是有用的,对吗?或者你的类层次结构设计得很糟糕。如果这就是问题的实际措辞,那么你无论如何也不会想要这份工作。任何人如果不能写出一套连贯的要求,然后因为你不能理解他们的胡言乱语而责骂你,你就不是那种你想为之工作的人。你能详细阐述一下你的想法吗?我认为国际米兰