2016-04-14 117 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功能只是一次,然后其它的方法传递到它。