2016-05-31 106 views
0

我很清楚oop的多態性和繼承概念,但是我處於需要知道實現類的情況。例如:如何檢索父接口的實現類/接口?

public CommonReadRepository<?> getReadRepository(String tableName) { 
     if (tableName == null) 
      return null; 
     switch (tableName) { 
     case "order": 
      return orderRepository; 
     ... 
     } 
     return null; 
    } 

接口orderRepository擴展CommonReadRepository,而且由於我的要求,我需要訪問orderRepository定義的函數。

CommonReadRepository<?> repository=getReadRepository("order"); 

有什麼辦法來檢查執行(子)類或接口CommonReadRepository

當然,我總是可以做這樣的事情:

if(tableName=="order") 
return (OrderRepository)CommonReadRepository<?>; 

我試着調試getReadRepository("order"),但它給我的JdkDynamicAopProxy的情況下,我不知道它是如何工作的。

如果(接口的instanceof XYZ類) 我不想使用它,因爲我有類100,我想保持它作爲最後的手段...或者換句話說 我不知道XYZ類

感謝

+0

我真的不知道你是什麼'請問......你不能使用'''instanceof'''或'''getClass()'''? –

+4

如果您需要訪問該方法,則應使用包含它的參數類型。這聽起來像是一個設計問題。 – chrylis

回答

1

以下是一個方法來檢查,如果返回的對象是指定類的一個實例:

CommonReadRepository<?> repository=getReadRepository("order"); if(repository instanceof WhatEverSubclass) { // do something }

但是使用這種方法並不是OOP應該如何完成的。如果你的類都實現了相同的接口,爲什麼不定義一個通用的方法,然後在所有的子類中使用,但每次都以不同的方式實現。

+0

接口可以具有實現類必須提供的自標識符。 – Grayson

0

我想,你試圖做的是不讓你到達任何地方。

您可以使用反射工具(https://github.com/ronmamo/reflections)找到繼承接口的所有可用類。我用它作爲依賴注入器,它工作非常可靠。

然而,你爲什麼不只是使用instanceof運算符,以確保該對象是正確的類型:

if(repository instanceof OrderRepository) return (OrderRepository)repository; 

但儘管如此,這不會改變你的功能,你的返回類型需要在函數之外再次檢查返回值的類型。

更新:如果這種情況發生了上百個對象,你可以改變getRepository方法返回你給的參數類型:<T> getRepository(String name, Class<T> expectedType)

這將讓你OrderRepository o = getRepository("order", OrderRepository.class);

+0

我不能使用instanceof,我有100多個類,並用instanceof檢查它是最後的手段 – Roxy