2016-09-16 56 views
1

(我是一个新手开发商还在学习最佳实践和Java - 任何帮助/方向,将不胜感激,谢谢!)如何在没有多重继承的情况下避免代码重复(即在java中)?

假设我有以下情况:

  • ClassA扩展抽象ClassB这延伸摘要ClassC
  • ClassD延伸摘要ClassE其中延伸摘要ClassF 其中延伸摘要ClassC

[ClassC是父类]

其中ClassAClassD有一组相同的属性,吸气剂,&制定者。

我想避免代码重复(属性,getters,setters)。我也想避免写出不同的方法doSomething(ClassA class, ...)doSomething(ClassD class, ...),这些方法除了参数类型外都是相同的。

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

+0

那么在Java中,你可以使用* interfaces *。 –

+3

你有没有具体的例子说明你为什么会让互通图变得如此之深? –

+1

所以D是一个E是一个F是一个C.这是有点太多的继承使用。 –

回答

1

首先,常用的方法,让我说,这是很好的时候(由自己承认)新手开发者关心这类问题。这是一个难以解决的棘手问题。

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

另一种方法是避免继承,并使用组合。这意味着你将有一个类ClassAD其中将包括ClassAClassD之间通用的功能,那么您将ClassA包含ClassAD一个实例,然后你会作出ClassD还包含ClassAD一个实例,然后你将有一个ClassAD getAD()方法中的某个位置,以便ClassAClassD都有。

因此,如果ClassAD包含方法foo(),您可以使用instanceOfA.getAD().foo()instanceOfD.getAD().foo()

0

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

0

在我看来,这可能是有一个ClassAD有用,扩展ClassC并包含ClassAClassD.

常见的方法的另一个选择是创建一个接口InterfaceAD并有ClassAClassD实现它。使用接口作为参数的功能,如doSomething(InterfaceAD i)

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级

0

你应该真的在这里讨论抽象类。你打算怎么样test A,B和C,D,E和F?
这将包括由C语言实现的(因为它也被用于所有其他类)的任何方法有很多重复的测试用例的等

正如人们所说的,确实讨论过遗传组成。 A可能有一个C,并通过方法。它也可能有一个Q,因此将D.
d和A可以再实现相同的接口(也可能由Q来实现,尽管这可能会使其混乱)

要知道,我不是抽象类的粉丝,并且倾向于使用组合和/或策略来代替。