2016-04-14 113 views
1

使用Java。如何實現一個方法被抽象子類繼承?

我定義了幾個不同的抽象類,每個類都有一個名爲aCommonMethod的靜態方法。每個人也有自己調用aCommonMethod依賴的方法,具體如下:

public abstract class SomeAbstractClass{ 
    public static void aCommonMethod() { 
    // does something 
    } 

    public static void someDependentMethod() { 
    //some stuff 
    aCommonMethod() 
    //some more stuff 
    } 
} 

方法someDependentMethod是我的每一個抽象類的相同,除了什麼方法被調用aCommonMethod調用。

在Java中,實現它的慣用方法是什麼?到目前爲止,我找不到實際上將aCommonMethod方法複製到每個抽象類中的東西。顯然,最好只在某個地方寫這個方法,然後讓我的抽象類以某種方式繼承它。我無法找到任何方式來在Java中做到這一點。

+0

SomeAbstractClass實際上並不抽象。你發佈了正確的代碼嗎? –

+0

爲什麼使用抽象類而不是接口? –

回答

0

我不是舒爾如果我得到你的觀點,但通過使用這些2類我倒是解決您的問題:

媽媽級:

public class mother 
{ 
    public void sortTest() 
    { 
     //some stuff 
     child.sort(); 
     //some stuff 
    } 
} 

兒童類:

public abstract class child extends mother 
{ 
    public static void sort() 
    { 
     //some stuff 
    } 
} 

你應該更準確地描述你的問題!

+0

世界上的我怎能更精確?我以精確的數學精確度說明了問題,並將所有不相關的細節都抽象出來。即使如此,這可能實際上是我需要的答案,所以謝謝。 – AdamHolder

+0

爲什麼抽象類而不是接口? –

+1

@AdamHolder - 你真的認爲你指定的問題具有如此精確的精確度和必要的確切數量,但程序開發人員仍然不明白你想要什麼?從你的問題中可以清楚地看到你不瞭解基本的Java,但你仍然拒絕聽取合理的問題。 –

0

這是抽象方法的用途。

abstract class SomeAbstractClass { 
    public abstract void aCommonMethod(); 

    public void someDependentMethod() { 
     // some stuff 
     aCommonMethod(); 
     // some more stuff 
    } 
} 

class Impl1 extends SomeAbstractClass { 
    @Override public void aCommonMethod() { 
     System.out.println("Impl1 version of aCommonMethod"); 
    } 
} 

每個子類可以實現的抽象方法做自己的事,和普通超類方法將調用具體子類的實現。

繼承不適用於靜態方法,請改爲使用這些實例方法。慣用的答案是避免使用靜態方法作爲類層次結構的一部分。

你在你的例子中有什麼,從你定義的aCommonMethod作爲返回void來判斷,似乎是有狀態和副作用的,但如果你有一個無狀態靜態方法的集合,那麼看起來你可能會根本不需要類層次結構;考慮使用策略模式,傳入指定應該如何完成一些操作的對象。請參閱this question,以便在Java 8中傳遞使用lambdas的策略。

+0

感謝您的合法答覆​​。但是,與Java的WAY相反,將所有QuickSort方法收集到一個抽象的QuickSort類中是否相反?這就是我在這裏所做的。我認爲這與Java.util的Arrays類非常相似。這只是一組有用的功能。沒有理由說爲什麼有人會在我寫它的時候實例化一個QuckSort對象。 – AdamHolder

+0

@AdamHolder:像java.util.Arrays這樣的東西不會被繼承。如果你有無狀態的函數,那麼靜態方法是可以的,但是如果你希望覆蓋行爲,那麼你需要實例方法。 –

1

第一,如果您希望不同的類具有不同的行爲,您不能重寫靜態方法,可能需要template pattern

實施例:

public abstract class SomeAbstractClass{ 
    public abstract void aCommonMethod(); 

    public void someDependentMethod() { 
     //some stuff 
     aCommonMethod(); 
     //some more stuff 
    } 
} 

public abstract class SomeClass{ 
    public void aCommonMethod() { 
     // Do your thing 
    } 
} 

public abstract class SomeOtherClass{ 
    public void aCommonMethod() { 
     // Do your thing 
    } 
} 

new SomeClass().someDependentMethod(); 
new SomeOtherClass().someDependentMethod(); 
-1

從Java 8的,現在可以將函數作爲參數代入使用lambda表達式等功能。然而,程序員在Java 8之前就已經解決了這個問題,他們的過度複雜的機制已經過時了。

例如,使用新的lambda表達式,可以寫

interface PointlessInterfaceObject { 
    void onlyFunction(); 
} 

然後someDependentMethod可以這樣定義:

someDependentMethod(PointlessInterfaceObject myPointlessInterfaceObject){ 
// some code 
myPointlessInterfaceObject.onlyFunction(); 
// more code 
} 

現在,如果你先初始化匿名函數像這樣,

PointlessInterfaceObject myAnonymousFunction =()->SomeAbstractClass.aCommonMethod(); 

然後您可以將它作爲參數傳遞給會面HOD如下:

someDependentMethod(myAnonymousFunction) 

這允許你寫就像someDependentMethod功能只是一次,然後其它的方法傳遞到它。