【问题标题】:Implementing Generic Interfaces and inheritance实现通用接口和继承
【发布时间】:2016-02-02 02:58:05
【问题描述】:

尝试在 Java 项目中实现泛型和继承类。 出于这个原因,我创建了“基”类和接口,它们将继承所有特定的类和接口。

我的意思是,我有一个基本接口

public interface BaseServices<T> {
    public boolean validate(T item, int id) throws Exception;
}

以及该接口的基本实现

public class BaseServicesImpl implements BaseServices<BaseBO> {

@Autowired
BaseDao dao;
CategoryBO bo;

public BaseServicesImpl()
{
    this.bo = new CategoryBO();
}

    @Override
       public boolean validate(BaseBO item, int id) throws Exception {
       return dao.validate("name",item.toString(), id);
    } 
}

BaseBO 是所有其他对象都将扩展的业务对象。

然后,对于特定对象,我将拥有一个扩展基础接口的特定接口。

public interface CategoryServices extends BaseServices {
    }

及其实现:

public class CategoryServicesImpl extends BaseServicesImpl implements CategoryServices<CategoryBO> {

    @Autowired
    CategoryDao categoryDao;

    public CategoryServicesImpl()
    {
        this.dao = categoryDao;
    }

    @Override
    public boolean validate(CategoryBO item, int id) throws Exception {
            return dao.validate("name",item.getName(), id);
    }
}

某些对象可以实现通用的“Validate”方法(仅验证名称)或将其扩展为所需的类公共类 CategoryServicesImpl 扩展 BaseServicesImpl 实现 CategoryServices。

我怎样才能做到这一点?是否可以?我正在尽我所能重用我的代码。如果有其他方法,请告诉我。

编辑: 我想做的是有一个基类,其中包含所有类的所有通用方法,比如说,创建、编辑、删除、获取、getAll 等的基本方法。然后在每个类中我也可以拥有并覆盖这些方法,因为在某些类中它们会有所不同,但在大多数情况下,它们只会做相同的事情,因此它将调用在基类中定义的通用方法。

【问题讨论】:

  • “我怎样才能完成这项工作?”你到底想做什么?
  • 这可能是对继承的滥用,以后会让你头疼。我的建议:通过重构而不是大的前端类层次结构来消除重复。
  • tl;dr,但乍一看似乎至少也应该输入BaseDao,可能还有CategoryDao,可能与impl的类型相同
  • 你说CategoryServicesImpl extends BaseServicesImpl,但为什么呢?我看不出它有什么好处。
  • @AustinD 我添加了一些关于我想要做什么的额外信息。

标签: java object generics inheritance


【解决方案1】:

您可以轻松实现您想要的,只需进行一些更改:

public interface BaseServices<T extends BaseBO> {

    boolean validate(T item, int id) throws Exception;
}

public interface CategoryServices 
    extends BaseServices<CategoryBO> {
}

public class BaseServicesImpl<T extends BaseBO> 
    implements BaseServices<T> {

    @Override
    public boolean validate(T item, int id) throws Exception {
        return true;
    }
}

public class CategoryServicesImpl 
    extends BaseServicesImpl<CategoryBO> 
    implements CategoryServices {

    @Override
    public boolean validate(CategoryBO item, int id) throws Exception {
        return true;
    }
}

关键是让您的泛型T 类型成为BaseBO 的后代,然后将您的BaseServicesImpl 类调整为也是泛型的。

【讨论】:

  • 我将此答案标记为正确,因为它有效!但最后我将这个答案的一部分与@munk 的评论混合起来以简化一些事情
【解决方案2】:

警告 see my comment on good design。简单是好的软件的关键。过度设计是通往疯狂的道路。

如果您有一个接口并且您需要在实现该接口的类之间共享某些方法的实现,您可以使用Abstract Base Class 来实现您需要共享的方法。

public interface Service<T> { 
    //note, interfaces are implictly public
    boolean validate(T item, int id) throws Exception;
    void foo();
    void bar();
}

public abstract class BaseService<T> {
    boolean validate(T item, int id) throws Exception {
        return false; // a default implementation
    }
    public abstract void foo();
    public abstract void bar();
}

public class FooService<T> extends BaseService<T>{
    public void foo() {
        println("foo"); 
    }
    public void bar() {
        println("bar"); 
    }
}

使用 Java 8,还可以提供default implementations in an interface

public interface Service<T> { 
    boolean validate(T item, int id) throws Exception;
    void foo();
    void bar();
}

但请注意,这可能会导致一种多重继承,这可能会使您的代码更难推理。

【讨论】:

  • BaseService是否应该实现Service??
  • @paramupk 该类没有要实现的 Service。除非您通过线路付款,否则您可以选择其中之一。更喜欢接口而不是抽象类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2016-10-23
  • 2012-11-12
  • 2012-01-08
相关资源
最近更新 更多