2012-12-16 44 views
2

它似乎工作,但它是一個'好'的編程?將類型轉換爲超類並調用override方法可接受? (Java)

下面是一個例子來闡明:

public class foo{ 
    foomethod(){do something}; 
} 

public class foo1 extends foo{ 
    @override foomethod(){do something}; 
} 

public class foo2 extends foo{ 
    @override foomethod(){do something}; 
} 

ArrayList x /*with foo1 and foo2 objects*/ 
for (Object o : x){((foo)o).foomethod();} 

是這個concidered「好」節目,如果沒有什麼是一個不錯的緊湊的替代? (除了開關(o.getClass()),如果可能的話)

編輯,因爲我真的很糟糕的澄清似乎:)

我的意思是調用已重寫方法,而不是超方法。 什麼我想要做的是另一種方法:

ArrayList中的x/*再次foo1和foo2的對象*/

for (Object o : x){ 
    switch(o.getClass()){ 
     case foo1.class: 
      ((foo1)o).foomethod(); 
      break; 
     case foo2.class: 
      ((foo1)o).foomethod(); 
      break; 
    } 
} 

,但我想避免switch語句,因爲它使代碼更更大更復雜。

+3

好吧,如果你的軟件設計的很好,你應該永遠不需要那樣做。覆蓋該方法的重點是因爲如果一個對象是超類的子類,它應該具有不同的功能。 – Joel

+0

*「我的意思是調用已被覆蓋的方法,而不是超級方法。」* - 這沒有意義。超類中的方法是重寫的方法! –

+0

我知道,有些事情很難用第一種語言進行溝通,對不起,我的意思是調用重寫超級方法的方法,這樣做會讓人感覺如何? – r0t0r

回答

1

看來工作,但它concidered '好' 的編程?

模與你的問題的措辭問題...

是的,這是良好的編程超類聲明的方法,在子類中重寫它,polymorphicly調用它。

它肯定比在類名上使用instanceof測試鏈或switch好得多。這些方法被認爲是「不好的」......因爲它們涉及將太多的類層次結構知識引入其他代碼。例如,如果您添加Foo的另一個子類別,則需要檢查所有這些開關並可能進行更改。 (編譯器不會提醒你這樣做......)

+0

謝謝,並再次所有抱歉,如果我的問題(這正是這一點)很難得到,因爲英語不是我的第一語言。我必須將這個答案設定爲已接受的答案,因爲它完全符合要求,但感謝您的答案。 – r0t0r

2

不管它是否被認爲是可以接受的,都完全在這一點上。真正的問題是,它不會做你認爲它所做的事情。它不會'調用重寫的方法'。派生類的方法仍然被調用。如果你想調用重寫的方法,你必須在派生類中使用super關鍵字。

+0

哦,我的壞,我的意思是調用擴展類的方法,而不是超類的方法。 – r0t0r

+0

在這種情況下,您所做的只是兩種選擇之一,另一種是使用泛型,因此您的問題再次徒勞無益。 – EJP

2

你可能想使用泛型:

public class Foo{ 
    public void fooMethod(){ System.out.println("Foo");}; 
} 

public class Foo1 extends Foo{ 
    @Override public void fooMethod(){System.out.println("1");}; 
} 

public class Foo2 extends Foo{ 
    @Override public void fooMethod(){System.out.println("2");}; 
} 

... 

List<Foo> x = new ArrayList<Foo>(); 
x.add(new Foo1()); 
x.add(new Foo2()); 
x.add(new Foo()); 

for (Foo o : x){ o.fooMethod();} 

輸出將是:

1 
2 
Foo 
+0

+1。如果你正確地做到這一點,根本不需要鑄造。 –

+0

這實際上正是我在我的代碼實際上做的,所以我想沒有問題/反對與實際類型化Foo1和Foo2 Foo並調用重寫方法。如果我沒有遺漏什麼,那麼謝謝你應該是這樣的:) – r0t0r

相關問題