Я немного сбит с толку относительно фактической реализации кода из абстрактных классов и его значения.
Я написал код для Max Heap и хотел создать абстрактный класс на его основе, чтобы иметь общую схему для кучи, которая не является просто "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) {...}
// ******************
// non-public methods
// ******************
protected void swap(int pos, int otherPos) {...}
// ****************
// abstract methods
// ****************
protected abstract void addHeapify(int pos);
protected abstract void deleteHeapify(int pos);
protected abstract void deleteExtremum();
}
Понимание правильного пути к «абстрактному-если» исходному классу очень поможет мне.
Правильно ли добавлять поля и конструктор в абстрактный класс, и, хотя add, delete, swap и display не меняются в разных кучах, должны ли эти методы быть абстрактными?
Мне также было интересно, стоит ли мне вместо этого использовать интерфейс, но он выглядит как более строгий абстрактный класс, и я не смогу определить add, delete, swap и display.