如何在没有多重继承的情况下(即在java中)避免代码重复?

时间:2016-09-16 21:41:22

标签: java abstract-class multiple-inheritance extends

(我是一名新手开发人员,仍在学习最佳实践和java - 任何帮助/指导都将不胜感激,谢谢!)

假设我有以下情况:

  • ClassA扩展了抽象ClassB,它扩展了抽象ClassC
  • ClassD扩展了抽象ClassE,它扩展了抽象ClassF 它扩展了抽象ClassC

[ClassC是父类]

其中ClassAClassD有一组相同的属性,getter和& setter方法。

我想避免代码重复(属性,getter,setter)。我还想避免编写除参数类型之外的所有方法doSomething(ClassA class, ...)doSomething(ClassD class, ...)

如果这两个类直接从ClassC继承,我会让它们扩展一个包含所有getter和setter和属性的类,并将该类型传递给方法doSomething(..)。由于ClassAClassD无法扩展多个类,因此处理这种情况的最佳方法是什么?

5 个答案:

答案 0 :(得分:2)

首先,让我说,当(自己承认)新手开发人员关注此类问题时,这是非常好的。这是一个难以解决的难题。

一种方法是让您的类实现接口而不是扩展其他类。在java中,类不能扩展多个类,但它可以实现多个接口。不幸的是,这并没有为您节省大量工作,因为当一个类实现一个接口时,您仍然需要编写所有的实现代码。

另一种方法是避免继承,而是使用组合。这意味着您将拥有一个类ClassAD,其中包含ClassAClassD之间的公共功能,然后您将ClassA包含ClassAD的实例然后你会让ClassD也包含ClassAD的实例,然后你会在层次结构的某个地方有一个ClassAD getAD()方法,这样ClassA和{{}拥有它。

因此,如果ClassD包含方法ClassAD,您可以执行foo()instanceOfA.getAD().foo()

答案 1 :(得分:0)

我不确定我是否正确理解了您的问题,但我会尝试一下。而不是多个抽象类,创建多个接口。然后创建一个实现两个接口的类。 Java允许实现多个接口,但不能从多个类扩展。

答案 2 :(得分:0)

在我看来,拥有一个SELECT ID ,CASE WHEN SUM(IIF(TypeCol = 'type1',1,0)) = 0 THEN 'type1' ELSE '' END as Type1 ,CASE WHEN SUM(IIF(TypeCol = 'type2',1,0)) = 0 THEN 'type2' ELSE '' END as Type2 ,CASE WHEN SUM(IIF(TypeCol = 'type3',1,0)) = 0 THEN 'type3' ELSE '' END as Type3 ,STUFF( REPLACE ( REPLACE ( + ',' + CASE WHEN SUM(IIF(TypeCol = 'type1',1,0)) = 0 THEN 'type1' ELSE '' END + ',' + CASE WHEN SUM(IIF(TypeCol = 'type2',1,0)) = 0 THEN 'type2' ELSE '' END + ',' + CASE WHEN SUM(IIF(TypeCol = 'type3',1,0)) = 0 THEN 'type3' ELSE '' END ,',,,',',,') ,',,',',') ,1,1,'') as MissingTypeList FROM TableA GROUP BY ID HAVING SUM(IIF(TypeCol = 'type1',1,0)) = 0 OR SUM(IIF(TypeCol = 'type2',1,0)) = 0 OR SUM(IIF(TypeCol = 'type3',1,0)) = 0 可能会有用,它可以扩展ClassAD并包含ClassCClassA

共有的方法

另一种选择是创建一个接口ClassD.,并InterfaceADClassA实现它。使用界面作为函数的参数,例如ClassD

答案 3 :(得分:0)

你可以这样做

class M

    class A extends B

        inherit B's stuff

    class D extends E

        inherit E's stuff

    A b = new A();
    D d =  new D();
    // or use anonymous classes

     M has access to everything in A and D,
    therefore M has access to A and D inheritable assets.

现在在C class中添加常用方法

答案 4 :(得分:0)

你应该在这里讨论抽象类。你将如何测试 A,B和C,D,E和F? 这将包括许多由C实现的方法的重复测试用例(因为它也被所有其他类使用),等等。

如前所述,真正讨论了继承的构成。 A可能有C,并通过方法。它也可能有Q,所以也是 D和A都可以实现相同的接口(也可能由Q实现,尽管这可能会让它变得混乱)

请注意,我不是抽象类的粉丝,而是喜欢使用组合和/或策略。