2013-08-21 277 views
0

问候和称呼!扩展抽象类 - 实现抽象方法

我目前有一个抽象类A和许多类继承它。对于我放入oneMethod()的所有子类通用的代码,以及我已经将两个抽象方法放入每个实现的特定代码。

public abstract class AbstractA { 
    public oneMethod() { 
      //do some intelligent stuff here 
      abstractMethodOne(); 
      abstractMethodTwo(); 
    } 
    protected abstract void abstractMethodOne(); 
    protected abstract void abstractMethodTwo(); 
} 

我有覆盖oneMethod()方法的类。

public class B extends AbstractA { 
    @Override 
    public oneMethod() { 
      //do some other intelligent stuff here 
    } 
} 

有什么办法可以跳过在子类中创建两个抽象方法的存根实现吗?我的意思是他们唯一使用的地方是重写的方法。

任何帮助表示赞赏!

回答

2

您必须为所有抽象方法提供实现。即使程序中没有任何部分调用它们,现在可以创建一个类来调用它们,也可以改变超类的实现。即使只是为了实现二进制兼容性,也需要一个存根。

5

不可以。如果扩展抽象类,则必须使子类抽象或必须满足父类的约定。作为设计观察,我建议您尝试使oneMethod()成为最终或抽象。维护允许扩展的程序很难实现它。使用其他抽象方法将子类挂钩到oneMethod()的功能中。

0

好吧,如果abstractMethodTwoabstractMethodOne是实现特定的,为什么你把抽象基类的这些方法?也许一个共同的接口或某些特定的设计模式是你在找什么!

+0

因为oneMethod需要调用它们。 –

0

如果你的类B和A必须实现自己的oneMethod,这可能是因为没有继承链接,但它们应该实现相同的接口?

2

你可以拉oneMethod成一个超:

public abstract class AbstractC { 
    public void oneMethod() { 
    } 
} 

public abstract class AbstractA extends AbstractC { 
    @Override 
    public void oneMethod() { 
    //do some intelligent stuff here 
    abstractMethodOne(); 
    abstractMethodTwo(); 
    } 

    protected abstract void abstractMethodOne(); 

    protected abstract void abstractMethodTwo(); 

} 

public class B extends AbstractC { 
    @Override 
    public void oneMethod() { 
    //do some other intelligent stuff here 
    } 
} 

现在看你怎么不不需要任何更多的AbstractC比你所需要的。

+0

Ick。多层次的抽象类?我不会走那条路。 –

+1

@EricStein - 如果抽象令你不愉快,它可能是一个'interface'。 – OldCurmudgeon

1

只是让B类也抽象。

public abstract class B extends AbstractA { 
+0

这将解决编译问题,但我还需要稍后实例化类,因此无论如何都需要存根。 –

+1

这与未制作AbstractA摘要并具有空的方法体相同。或者你可以在最后做:'new B(){@Override public void abstractMethodOne(){...} ...}'。 –

+0

这实际上对我来说效果更好,考虑到存根的数量因此减少到2,而不是(覆盖oneMethod的#个子类)* 2。 –

1

由于abstractMethodOne()abstractMethodTwo()是实现特定的,但你知道,你总是会打电话给他们,你可以使用组成是这样的:

public interface SomeInterface { 
    void abstractMethodOne(); 
    void abstractMethodTwo(); 
} 

,创建这样一个类:

public class SomeClass { 
    public void executeThem(SomeInterface onSomeObject) { 
     onSomeObject.abstractMethodOne(); 
     onSomeObject.abstractMethodTwo(); 
    } 
} 

然后你可以在任何你想要调用这些方法的类中编写它:

public class SomeImplementation implements SomeInterface { 

    public void abstractMethodOne() { 
     // ... 
    } 
    public void abstractMethodTwo() { 
     // ... 
    } 

    public void executeThem() { 
     new SomeClass().executeThem(this); 
    } 
} 

这样你就完全摆脱了继承,你可以在实现SomeInterface的类中更灵活。

+0

这实际上很聪明,但我仍然有一些需要在子类中访问的超类参数,因此据我所知,继承是需要的。 –

+0

你的意思是超类有一些你需要访问的字段? –