我有這種情況:執行方法/代碼基於運行時對象類型
我有一個抽象類,讓我們說A,實施多次。 在應用程序的另一部分,我有一個A對象的列表,並且我需要根據列表中對象的實際類型執行幾個操作。 作爲一個例子
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
abstract class A{
abstract void op();
}
class B extends A{
void op(){
System.out.println("b");
}
void opB(){
System.out.println("it's b again!");
}
}
class C extends A{
void op(){
System.out.println("c");
}
void opC(){
System.out.println("it's b again!");
}
}
class Ideone
{
public static void doStuff(B b){
b.opB();
//Some operation unique to class B
}
public static void doStuff(C c){
//some operation unique to class C
c.opC();
}
public static void main (String[] args) throws java.lang.Exception
{
List<A> l = someMethodThatGivesMeTheList();
for(A a: l){
//Here it should use the right
doStuff(a);
}
}
}
的例子並不編譯,但解釋了我想做的事情。怎麼樣?
我發現只有以應用Visitor模式的可能性,但這需要修改的A類和它的子類,接受訪問者,我寧願避免。
使用getClass()
和開關\如果是笨拙的,而不是真的有什麼我要找的。
在這個例子中我用了兩個靜態方法,但一些新的類,包裝,什麼都可以,只要它解決了這個問題時,我有過代碼的完全控制。
這裏的一個類似的問題是Calling method based on run-time type insead of compile-time type,但在我的情況下,我正在使用Java,所以沒有dynamic
類型存在來解決我的問題。
編輯:我寫在這裏我已經寫在評論什麼只是爲了使其更清晰。該操作不能成爲A的方法,因爲它代表必須分離的事物,如基於實際數據類型的GUI創建。一個並行層次結構可以作爲一個包裝器,但是仍然需要根據實際對象創建正確的GUI對象,這讓我想起了同樣的問題,至少在我看來這是這樣。
EDIT 2(返程):我已經改變了一點點的例子,以更好地表明,我需要根據實際的類做的東西。這是有點遠離我的情況,但問題是一樣的,一個集合擦除實物類,我需要一種方法來恢復它更聰明的是instanceof
或getClass()
將'C類獨特的某些操作'移動到'C#op'並使用動態分派。 –
在我的情況下,這將違反視圖和模型之間的分離,因爲'//對C類特有的某些操作是在這種情況下創建GUI元素來操作數據,B和C是不同類型的數據共享相同的界面(A)。 – bracco23