(我是一名新手开发人员,仍在学习最佳实践和java - 任何帮助/指导都将不胜感激,谢谢!)
假设我有以下情况:
ClassA
扩展了抽象ClassB
,它扩展了抽象ClassC
。ClassD
扩展了抽象ClassE
,它扩展了抽象ClassF
它扩展了抽象ClassC
。 [ClassC
是父类]
其中ClassA
和ClassD
有一组相同的属性,getter和& setter方法。
我想避免代码重复(属性,getter,setter)。我还想避免编写除参数类型之外的所有方法doSomething(ClassA class, ...)
和doSomething(ClassD class, ...)
。
如果这两个类直接从ClassC
继承,我会让它们扩展一个包含所有getter和setter和属性的类,并将该类型传递给方法doSomething(..)
。由于ClassA
和ClassD
无法扩展多个类,因此处理这种情况的最佳方法是什么?
答案 0 :(得分:2)
首先,让我说,当(自己承认)新手开发人员关注此类问题时,这是非常好的。这是一个难以解决的难题。
一种方法是让您的类实现接口而不是扩展其他类。在java中,类不能扩展多个类,但它可以实现多个接口。不幸的是,这并没有为您节省大量工作,因为当一个类实现一个接口时,您仍然需要编写所有的实现代码。
另一种方法是避免继承,而是使用组合。这意味着您将拥有一个类ClassAD
,其中包含ClassA
和ClassD
之间的公共功能,然后您将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
并包含ClassC
和ClassA
另一种选择是创建一个接口ClassD.
,并InterfaceAD
和ClassA
实现它。使用界面作为函数的参数,例如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实现,尽管这可能会让它变得混乱)
请注意,我不是抽象类的粉丝,而是喜欢使用组合和/或策略。