访问对象(动态选择)子类的功能

Ato*_*rce 1 java inheritance static-typing class superclass

我正在尝试实现一个简单的二进制堆类,用户可以在其中选择是否需要最小或最大堆.

我制作了超级抽象:

abstract class Heap 
{
    size() { ... }

    peek() { ... }
}
Run Code Online (Sandbox Code Playgroud)

main方法选择实例化maxHeap或minHeap子类.

public static void main(String[] args)
{
    Heap myHeap = new minHeap();
    if ( /* some condition */ )
        myHeap = new maxHeap();   
}

myHeap.insert(/* some value */);
Run Code Online (Sandbox Code Playgroud)

insert函数在min和max堆类中的实现方式不同:

class minHeap extends Heap
{
    public void insert() { ... }
}

class maxHeap extends Heap
{
    public void insert() { ... }
}
Run Code Online (Sandbox Code Playgroud)

当然,从main调用insert()会引发错误,因为Heap类中没有这样的方法.在非常相似的最小和最大堆实现之间以编程方式进行选择的最佳方法是什么?

Ste*_*ner 7

insert在这两种情况下似乎都具有相同的签名,因此您可以将其提升到超类.只要签名相同,它们是否以不同方式实施并不重要.

然后你的Heap类就变成了

abstract class Heap 
{
    size() { ... }

    peek() { ... }

    abstract void insert();
}
Run Code Online (Sandbox Code Playgroud)