簡體   English   中英

實現通用接口和繼承

[英]Implementing Generic Interfaces and inheritance

試圖在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是所有其他對象都將擴展的業務對象。

然后,對於一個特定的對象,我將具有一個特定的接口,該接口擴展了Base接口。

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等的基本方法。然后在每個類中也可以具有和覆蓋這些方法,因為在某些類中它們將有所不同,但是在大多數情況下,它們將執行相同的操作,因此它將調用在基類中定義的泛型類。

只需進行一些更改,即可輕松實現所需的目標:

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類也調整為通用。

請注意 我對好的設計的評論 簡單是優質軟件的關鍵。 過度設計是通往瘋狂的道路。

如果您有一個接口,並且需要在實現該接口的類之間共享某些方法的實現,則可以使用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,還可以在interface中提供默認實現

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

但是請注意,這可能導致某種多重繼承,這可能會使您的代碼難以推理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM