实现通用接口和继承

3
尝试在Java项目中实现通用和继承类。因此,我创建了“Base”类和接口,这些类和接口将继承所有特定的类和接口。
我的意思是,我有一个基础接口。
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);
    }
}

在某些对象中,可以实现通用的“验证”方法(仅验证名称)或将其扩展到类所需的内容。

public class CategoryServicesImpl extends BaseServicesImpl implements CategoryServices。如何使此功能正常工作?是否可能?我正在尽力重用我的代码,请告诉我是否还有其他方法。

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


"我该如何让它工作?" 你具体想让什么东西工作? - Austin
1
这可能是对继承的滥用,将来会给你带来麻烦。我的建议是:通过重构来消除重复,而不是使用一个庞大的类层次结构。 - munk
@munk 抱歉,我是Java的新手,我正在尝试做一些我在其他语言中做过的事情,你能否更详细地解释一下你认为我可以进行哪些重构?我只想遵循最佳实践,我认为这是其中之一。 - Faabass
@munk,感谢您提供的所有信息,对我非常有用。所以您的建议是不要使用这个“Common”方法和接口来管理不同类型的业务对象。我只是在那里包含了通用功能和非业务对象逻辑。 因此,拥有一个通用类来管理不同类型的对象交互并不是一个好的做法。如果您有任何页面可以展示我们正在讨论的内容的示例,那对我来说将非常有用。 - Faabass
@Faabass,相关链接在我的评论中以蓝色标记。我并不是说使用一个公共类来管理对象的交互是一种不好的实践。我是说在你需要它之前就开始使用它是一种不好的实践。从一开始就过度设计你的解决方案。 - munk
显示剩余5条评论
2个回答

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

您只需进行一些更改即可轻松实现您想要的目标:

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的评论来简化一些事情。 - Faabass

1

注意请查看我对良好设计的评论。简单是好软件的关键。过度工程化只会导致疯狂。

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

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中,还可以在接口中提供默认实现

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

但是要注意,这可能会导致一种多重继承的情况,这可能会使您的代码更难以理解。


基础服务(BaseService)是否应该实现 Service<T> 接口? - paramupk
@paramupk 那个类没有实现Service<T>。你必须选择其中一个,除非你是按行计费的。优先使用接口而不是抽象类。 - munk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接