【问题标题】:How to put same behavior in a super class, which extends from classes?如何将相同的行为放在从类扩展的超类中?
【发布时间】:2017-02-13 07:46:04
【问题描述】:

我有以下三个类:

public class MyClassA extends FooA<Bar>
public class MyClassB extends FooB<Bar>
public class MyClassC extends FooC<Bar>

FooAFooBFooC 类都扩展了 Foobar&lt;V&gt; (-> public class Foobar&lt;V extends FooY&gt; implements IFoobar&lt;V&gt;),但继承级别不同。此外,值得一提的是,FooAFooBFooC 是 API 的一部分,我无法对其进行修改。在我的类MyClassAMyClassBMyClassC 中,我以完全相同的方式使用一些属性和方法,因此我想创建一个实现相同行为的父类。但是,我不确定如何通过泛型实现这种继承方案。

我想过这样的事情:

public class MyParentClass<V extends Foobar> extends V

然后我只需执行以下操作:

public class MyClassA extends MyParentClass<FooA<Bar>>
public class MyClassB extends MyParentClass<FooB<Bar>>
public class MyClassC extends MyParentClass<FooC<Bar>>

我怎样才能做到这一点?

【问题讨论】:

  • 听起来你在寻找多重继承,Java 并不真正支持。
  • 这些对象会被用作FooAFooBFooC 实例吗?还是你最后一直用Ifoobar
  • 它们最终将被用作IFoobar。请注意,IFoobar 也是 API 的一部分。

标签: java inheritance design-patterns


【解决方案1】:

当你被“太多继承”困住时,正确的答案可能是古老的口头禅:更喜欢组合而不是继承

换句话说:请记住,继承不仅仅是将“A extends B”放在某个类声明中;还要记住继承的主要意图是表达“是”关系;它不是是一种避免代码重复的简单方法。 (是的,代码重复非常重要,但使用继承来实现它通常是个坏主意!)

从这个意义上说:而不是进一步增加这个“继承丛林”;我宁愿退后一步,看看定义一些 new 接口是否有意义,这些接口可以更好地捕获您需要的一组功能;并创建实现这些接口的类;不是基于继承其他类,而是通过实例化这些类的对象;并进行一些包装。

【讨论】:

    猜你喜欢
    • 2016-04-15
    • 2016-12-26
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多