使用抽象类构造堆

我对抽象类中代码的实际实现以及它的意义有点困惑。


我为 Max 堆编写了代码,我想基于它创建一个抽象类,这样我就可以为不仅仅是“Max”堆的堆提供一个一般大纲。


我的MaxHeap的身体看起来像这样:


public class MaxHeap {


    // A class for nodes, just has 3 fields, lchild, rchild, and value

    private HeapNode top;

    private List<HeapNode> heap;


    public MaxHeap() {

        this.top = null;

        this.heap = new ArrayList<>();

    }


    //I won't go into the guts of these methods, but will explain


    //Displays the heap like [1,2,3,4,5,...]

    public void display() {...}


    //Adds a new HeapNode to the end of heap, if empty sets to top

    public void add(int value) {...}


    //Deletes a HeapNode at index pos

    public void delete(int pos) {...}


    //Swaps 2 Nodes within the heap

    protected void swap(int pos, int otherPos) {...}


    //// These are the methods that actually differ depending on the

    //// type of heap (maxheap, minheap, etc) so I would assume they

    //// would be abstract methods if writing an abstract class?

    |

    |

    V


    //Called within add method, heapifys the heap after adding a new Node

    protected void addHeapify(int pos) {...}


    //Called within delete method, heapifys the heap after deleted Node

    protected void deleteHeapify(int pos) {...}


    //Called within deleteHeapify for "if (pos==0) {...}", delete max Node

    protected deleteExtremum() {...}

}

我的问题反映了我究竟如何在更抽象的层面上实现这一点?我想把我的编码提升到一个新的水平,需要理解这一点。我会做一个这样的抽象类吗?


public abstract class Heap {


private HeapNode top;

private List<HeapNode> heap;


public Heap() {...}


// **************

// public methods

// **************


public void display() {...}

public void add(int value) {...}

public void delete(int pos) {...}


}

理解“抽象”原始类的正确方法将极大地帮助我。


在抽象类中添加字段和构造函数是否正确,即使添加、删除、交换和显示不会在不同的堆之间更改,这些方法也应该是抽象的吗?


我也想知道我是否应该使用接口,但它似乎是一个更严格的抽象类,我将无法定义添加,删除,交换和显示。


慕神8447489
浏览 105回答 1
1回答

holdtom

抽象类是几个具体类的泛化。它用于共享通用功能和数据。因为它是抽象的,所以如果没有一些自定义,它就无法实例化(使用)。如果该类可以按原样使用,则它不是抽象的。如果需要针对接口的抽象类,关键点是抽象是否包含数据。可以具有包含数据字段的抽象类,并且只能具有抽象方法。当泛型功能需要一些特定于继承器的数据或处理时,应使用抽象方法。就像你的方法出于某种原因需要调用,但并不关心它的实现方式。addaddHeapify如果你需要所有的后代都有某种方法,但它没有用于常见的功能,那么使用 Interface 是明智的,因为 Interface 定义了类应该如何行为,但没有定义它包含哪些数据。因此,您可以抽象包含不同数据的两个类。在Java 8中,您可以直接在接口中实现(这在以前是不可能的),因此只有当您有公共数据存储在其中时,才需要抽象类。default methods请记住,对抽象类或接口的引用可以被其他算法用来调用你的,而不知道引用背后的实现是什么。这主要用于使代码可变,因为您可以在不更改客户端代码的情况下替换接口或抽象类的任何实现。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java