java - 无需子类继承减少代码重复

标签 java inheritance interface modularity open-closed-principle

我正在研究子类化、接口(interface)和组合。当涉及到代码重复时,我最终对一些事情感到困惑。众所周知,在很多情况下,子类化和继承都不是可行的方法,但它在减少代码重复方面很有效。

接口(interface)很强大,如果操作得当,可以提供很好的可读性,但我无法理解这样一个事实,即它确实无法帮助我减少代码重复。我们可能会在子类化无效的情况下结束。但是扩展程序的可能性很大,每当我们这样做时,试图维护开放封闭原则,我们最终会以荒谬的副本数量进行接口(interface)的实现/实现粘贴代码,它可能可以通过子类化避免(就代码重复而言)。

我们如何通过接口(interface)和组合构建出色的策略,避免一遍又一遍地编写相同的方法?这样我们就可以在保持模块化的同时坚持开放封闭的原则。我们是否有任何指导方针可以帮助我们快速有效地决定代码重复是否值得?

干杯

/wallOfText>

最佳答案

面向对象建模是非常主观的,但我在这里唯一能做的就是旧的继承与组合讨论: https://www.thoughtworks.com/insights/blog/composition-vs-inheritance-how-choose

根据您的论点,我相信您经常尝试从两个或多个具有相似代码的类中提取一个父类(super class),这样它们就可以共享相同的继承方法,而不是仅仅复制它们。虽然从技术上讲,这正是您想要的,但您还应该注意继承语义,因为它将表示 is-a 关系(即汽车 is-a 车辆, dog is-a mammal, report-screen is-a read-only-screen).由于 Java 不提供多重继承,如果您的类层次结构增长,您最终可能会感到受限和困惑。

因此,在开始提取父类(super class)以供重用之前,请记住您还可以提取此code-i-want-to-reuse 单元作为一部分其他类(作文)。

抱歉我的概念性示例,但这里是: 狮子都是哺乳动物和猎人。它们自然应该继承 Mammals 父类(super class)(在哺乳动物中有很多可重用的代码)。由于并非所有哺乳动物都会捕猎,我们不想在 Mammals 类上定义新的 hunt() 方法。

此时,您可能正在考虑创建一个新的继承级别:哺乳动物 <- HuntingMammals。但是想一想:如果你继续对动物的每一个独特方面都这样做,你将在一个棘手和令人困惑的层次结构中拥有几十个类。除此之外,我们还知道一些爬行动物和鸟类也会捕猎,因此,我们最好将所有捕猎的东西隔离在别处。

作为继承的健康替代方案,我们可以定义一个单独的Hunter 类。要重用它的内容,我们需要做的就是将一个 Hunter 对象作为 DogLion (一个字段)的成员。如果我们需要将狗和狮子一起视为猎人(多态),我们可以定义一个CanHunt接口(interface)来对它们进行分组。

检查下面的例子:

class Hunter {
   void hunt(){
       System.out.println("i'm hunting...");
   }
}

interface CanHunt{
   Hunter getHunter();
}

class Dog extends Mammals implements CanHunt{
   ...
   Hunter hunter = new Hunter();
   
   @Override
   Hunter getHunter(){
       return hunter;
   }      
   ...
}


class Lion extends Mammals implements CanHunt{
   ...
   Hunter hunter = new Hunter();
   
   @Override
   Hunter getHunter(){
       return hunter;
   }      
   ...
}

这里我们有一个多态示例代码,它要求狗和狮子做他们的狩猎 Activity :

...
List<CanHunt> hunters = new LinkedList();
hunters.add(new Dog());
hunters.add(new Lion());

for(CanHunt h:hunters){
  h.getHunter().hunt(); //we don't know if it's a dog or a lion here...
}
...

我希望这个简单的例子能给你一些启发。如果我们不断将其发展为更详细但更灵活的设计,它可能会变得相当复杂。例如,Hunter 类可以是具有不同实现的抽象类,因为狗的捕猎方式与狮子不同,但它们有一些共同的行为。

关于java - 无需子类继承减少代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48508420/

相关文章:

java - 在 Scala 中创建具有任意类型和映射的三维数组

javascript - javascript继承之间的区别

java - 我可以在 Java 中使用子类对象作为参数来覆盖吗?

class - Scala——共同特质的二代传承

java - 是否有类似于 Callable 但带有参数的接口(interface)?

java - 如何在 Spring MVC REST 中为 JSON 设置内容长度?

Javadoc 警告 : no @param for type when using Lombok @Builder

java - 未调用 Apache Felix OSGi 框架的 WeavingHook.weave() 方法

pointers - 通过反射改变接口(interface)下的指针类型和值

Java:在最终类中实现接口(interface)的类