2011-06-09 102 views
4

我有幾個擴展其他類的類。他們都有一個共同的方法result。如果我有foobarbaz的實例,是否可以調用其父/祖父的result方法?在子類對象上調用父類的方法java

public class Foo { 
    protected int resultA; 
    public void calc(){ resultA=...} 
    public void result(){ return resultA;  } 
} 

public class Foobar extends Foo{ 
    protected int resultA; 
    public void calc(){ 
     super.calc(); 
     resultB=...; 
    } 
    public void result(){ return resultB;  } 
} 

public class Foobarbaz extends Foobar{ 
    protected int resultA; 
    public void calc(){ 
     super.calc(); 
     resultC=...; 
    } 
    public void result(){ return resultC;  } 
} 

我試圖解決的問題是每個類除了它的父類之外,還有一些額外的計算。如果用戶想要所有3個對象的結果,CalculationManager只知道Foobarbaz需要被引用和計算。然後它返回給Foobarbaz的參考資料給任何詢問Foo的人,因爲Foobarbaz也會爲Foo產生結果。

喜歡的東西:

CalculationManager.add(Foo,Foobar,Foobarbaz); 
//The following 3 calls return the same reference to a Foobarbaz object 
Foo  res1=CalculationManager.get(Foo); 
Foobar res2=CalculationManager.get(Foobar); 
Foobarbaz res3=CalculationManager.get(Foobarbaz); 
CalculationManager.doCalc(); 
//Iterate over each object to get result with the same method .result() 
res1.result();  //---> resultA 
res2.result();  //---> resultB 
res3.result(); //---> resultC 
+0

愚蠢的問題,但你有什麼工作嗎?我看起來好像可能。 – Peaches491 2011-06-09 16:34:59

+0

我不能向你保證。Java有一些沿着動態方法調用的方式,即使你給一隻貓貼上標籤,然後調用getFood(),它會返回dogFood而不是catFood。 *不要試圖把狗當作貓來投放 – 2011-06-09 16:39:14

+0

你試圖這樣做的事實表明你可能在你的程序中有一個概念缺陷。因此,你應該花時間修復這個概念缺陷,而不是解決問題。無論如何,答案中的示例代碼將允許您這樣做。 – deadalnix 2011-06-09 16:53:05

回答

1

設計原理:在繼承

青睞組成獲取Head First設計模式書的副本和閱讀有關策略,模板,也許還工廠模式。在那裏討論的其他模式在這個項目或項目中的其他地方肯定會派上用場。

一個可能的場景:

  • 有富,FooBar的和FooBarBaz類從抽象類AbstractFoo擴展
  • 給AbstractFoo型計算器myCalc的屬性(和getter和setter去與)
  • 使計算器成爲doCalc()方法的接口,由實現此接口的類實現
  • 創建實現其自己版本的doCalc()的所有可能的Calculator實現(CalculatorX,CalculatorY,..)
  • 給AbstractFoo一個公衆詮釋計算()方法的myCalc.doCalc()方法調用,以獲得您所需要

點在哪裏,你不用擔心不同的計算器實現的結果有共同的代碼,您可以使用模板模式或讓它們從BaseCalculator等擴展。

這應該讓你忙一段時間,但如果你做得正確並掌握它,你會發現使用這樣的模式可以幫助你在許多編程情況下。因此,名稱模式,我猜;-)

+0

可以在這裏找到書[在這裏](http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124)等網上書店。 – Wivani 2011-06-10 09:11:35

0

超級調用父類

2

你需要像這樣在每個類的方法:

Foo: 
    printParent() 
    { 
     super.printParent(); 
    } 

FooBar: 
    printParent() 
    { 
     super.printParent(); 
    } 

FooBarBaz: 
    printParent() 
    { 
     print(); // this is the top most class 
     //Incredibly fragile! 
    } 
1

這是不是真的有可能。您必須實例化父類的對象才能調用其打印方法。

例如

FooBar f = new FooBar(); 
    f.print(); //foobar 

只有從子類中可以使用超級關鍵字來訪問超類的方法。

+0

如果方法是靜態的,您不必實例化 – Woot4Moo 2011-06-09 16:45:11

+0

@ Woot4Moo True。但是問題中的示例不包含靜態方法。 – 2011-06-09 16:48:57