如何实现一个方法被抽象子类继承?
使用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中做到这一点。
我不是舒尔如果我得到你的观点,但通过使用这些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
}
}
你应该更准确地描述你的问题!
世界上的我怎能更精确?我以精确的数学精确度说明了问题,并将所有不相关的细节都抽象出来。即使如此,这可能实际上是我需要的答案,所以谢谢。 – AdamHolder
为什么抽象类而不是接口? –
@AdamHolder - 你真的认为你指定的问题具有如此精确的精确度和必要的确切数量,但程序开发人员仍然不明白你想要什么?从你的问题中可以清楚地看到你不了解基本的Java,但你仍然拒绝听取合理的问题。 –
这是抽象方法的用途。
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的策略。
感谢您的合法答复。但是,与Java的WAY相反,将所有QuickSort方法收集到一个抽象的QuickSort类中是否相反?这就是我在这里所做的。我认为这与Java.util的Arrays类非常相似。这只是一组有用的功能。没有理由说为什么有人会在我写它的时候实例化一个QuckSort对象。 – AdamHolder
@AdamHolder:像java.util.Arrays这样的东西不会被继承。如果你有无状态的函数,那么静态方法是可以的,但是如果你希望覆盖行为,那么你需要实例方法。 –
第一,如果您希望不同的类具有不同的行为,您不能重写静态方法,可能需要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();
从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功能只是一次,然后其它的方法传递到它。
SomeAbstractClass实际上并不抽象。你发布了正确的代码吗? –
为什么使用抽象类而不是接口? –