2015-07-12 193 views
-4

設置類變量作爲方法的輸出(姑且稱之爲「A」)與一個抽象方法(我們稱之爲「AA()」 )返回另一個類的實例('B')。 我試圖對其中B的情況下,「屬於」(通過創建),這A.我在想這樣做的方法的實例是使用B的由AA()返回的實例作爲類變量信息對於答案。問題是,在圖書館裏,A已經執行了五十次以上,被稱爲比這更多次。在我上有一個抽象類的現有庫擴展一個抽象類

在庫中的一些進一步的背景中,類A和B是其中A的一個實例包含顯影層次結構的兒童(A的其他實例)大的遞歸模式的一部分。 A的層級首次開發則A.A()被用於開發B的層次結構(通過創建B的情況下,也有孩子),但是既不是「知道」有關的任何其他這是什麼,我試圖改變。

目前,我在A('A.c()')中設計了一個新方法,可以在子類中的每個()的實現的return語句處調用該方法。 A.c()簡單地接受返回的B的實例,爲該實例設置一個變量,然後將該實例返回給A.a()的返回語句。

的類和A和B涉及在實際文庫的方法有:原子(A),盒(B)和createBox(A.A())。 A.b和A.c()我已經包含了,因爲它們用於我當前的解決方案(請參閱上一段)。

public abstract class Atom { 

    private Box b = null; 

    public abstract Box createBox() 

    protected Box setB(Box box){ 
     this.b = box; 
     return box; 
    } 
} 

public class Alpha extends Atom { 

    ... 

    public Box createBox(){ 
     ... 
     Box box = new Box(); 
     ... 
     return setB(box); 
    } 
} 

我覺得這不是一個整潔,也不可管理的解決方案。理想情況下,我希望能夠編寫代碼,以便無論A.a()返回什麼,A中的變量都設置爲此。有沒有人知道實現這一目標的方式,或者可能提出一個更廣泛的戰略,我應該着眼於在不同的層面上解決這個問題?

任何幫助,特別是指導重新措辭的問題或瞭解更多信息的請求,將不勝感激!我一直在爭取這一天幾天,現在肯定我錯過了一些東西。

在此先感謝!

EDIT 1個

該文庫是通過SCILAB jlatexmath。 (http://forge.scilab.org/index.php/p/jlatexmath/downloads/

編輯2

底氣變化到庫的目的和更新類和方法名,以反映該庫。

+2

您可能想提及庫和/或提供其他上下文或示例代碼。事實上,這幾乎是不可理解的抽象,類和實例之間的關係很難遵循。 – pvg

+0

@pvg我已經添加了庫名,也會在一會兒抓一個URL。我正在努力思考我可以添加哪些代碼示例,因爲我在那裏的代碼示例實際上是在庫中發生的。你有什麼建議嗎? – lachy

+0

你寫的具體的類和方法是什麼?你試圖完成什麼樣的總體目標? – pvg

回答

0

將類視爲擁有實例的想法並不是Java思維,並且會導致您陷入痛苦的路徑中。

你應該考慮的是擁有一個生產實例並跟蹤它們的工廠類。該工廠可能想成爲一個單身人士。你做不是想要一個庫來跟蹤對象,你想要你自己的結構產生特定的一組對象並跟蹤它們,但是你需要跟蹤它們。

+0

謝謝!我認爲這就是我正在尋找的,在解決這個問題時我應該使用的結構。爲我的言辭滔滔不絕的問題歡呼! – lachy

0

更新:交換()和C()

我建議把「跟蹤」代碼爲抽象類A.該解決有已經有很多A-子類的問題。此外,我會用泛型能夠把你需要到A級以下的所有代碼只是一個草圖給一個想法:

public abstract class A<T extends B> { 
    private T b = null; 

    protected abstract T a(); 

    public final T c() { 
    this.b = a(); 
    return this.b; 
    } 
} 

public class Beta extends B { 
    ... 
} 

public class Alpha extends A<Beta> { 

    ... 

    protected Beta a(){ 
    return new Beta() 
    } 
} 

所以你跟蹤公共方法A和B之間的關係並使用抽象受保護的方法來創建Bs(即,您顛倒了原始方法的功能a()c())。這個設計使得Alpha.c()的實施變得直截了當。此外,使用泛型,它允許您將所有代碼放入A並在B的不同子類中實例化不同B.

+0

感謝您的回答!我不確定這是否會起作用,因爲在庫中調用的唯一方法是c(),所以我沒有看到A.a()會如何被調用? – lachy

+0

我以爲a()會被圖書館調用。只需交換一個()和c()比。 –

+0

謝謝,但這仍然讓我處於不得不編輯和維護每一個子類的相同位置,所以我不認爲這是我正在尋找的解決方案。 – lachy