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

Joh*_*ker 5 java inheritance modularity interface open-closed-principle

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

接口功能强大,如果正确完成操作,将提供很好的可读性,但是我无法解决这样的事实,即它实际上并不能帮助我减少代码重复。我们可能会遇到子类无效的情况。但是,扩展程序的可能性很大,并且每当这样做时,尝试维护Open封闭的主体,我们最终都会以荒谬的数量进行接口的实现/实现。粘贴代码,通过子类化(在代码重复方面)可以避免这种情况。

我们如何通过接口和组合构建出色的策略,从而避免一遍又一遍地编写相同的方法?这样,我们就可以保持模块性,并同时遵守开放式封闭原则。我们是否有任何准则来指导我们如何快速而有效地决定实际上是否值得进行代码重复?

干杯

</ wallOfText>

Raf*_*don 4

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

根据您的论证,我相信您经常尝试从具有相似代码的两个或多个类中提取超类,以便它们都可以共享相同的继承方法,而不仅仅是重复它们。尽管从技术上讲,这完全满足了您的需求,但您还应该注意继承语义,因为它将表示is-a关系(即,汽车车辆,狗哺乳动物,报告屏幕是阅读) -仅屏幕)。由于 Java 不提供多重继承,因此如果类层次结构增长,您最终可能会受到限制和困惑。

因此,在开始提取超类以供重用之前,请记住,您还可以提取此代码(我想重用)单元以成为其他类(组合)的一部分

抱歉我的概念性例子,但事实是狮子都是哺乳动物和猎人。它们自然应该继承Mammals超类(在哺乳动物中有很多可重用的代码)。由于并非所有哺乳动物都会狩猎,因此我们不想在Mammals类上定义新的Hunt()方法。

此时,您可能正在考虑创建一个新的继承级别:Mammals <- HuntingMammals。但想一想:如果您继续对动物的每个独特方面进行此操作,您将在一个棘手且令人困惑的层次结构中拥有数十个类。除此之外,我们还知道一些爬行动物和鸟类也会捕猎,所以,我们最好将所有捕猎的东西隔离在其他地方。

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

检查下面的示例:

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;
   }      
   ...
}
Run Code Online (Sandbox Code Playgroud)

这里我们有一个多态示例代码,要求狗和狮子进行狩猎工作:

...
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...
}
...
Run Code Online (Sandbox Code Playgroud)

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