访问对象(动态选择的)子类的函数
Accessing functions of an object's (dynamically chosen) subclass
我正在尝试实现一个简单的 binary heap class,用户可以在其中选择他们想要最小堆还是最大堆。
我做了超级class摘要:
abstract class Heap
{
size() { ... }
peek() { ... }
}
main 方法选择实例化 maxHeap 或 minHeap subclass。
public static void main(String[] args)
{
Heap myHeap = new minHeap();
if ( /* some condition */ )
myHeap = new maxHeap();
}
myHeap.insert(/* some value */);
插入函数在最小堆和最大堆中的实现方式不同classes:
class minHeap extends Heap
{
public void insert() { ... }
}
class maxHeap extends Heap
{
public void insert() { ... }
}
当然,从 main 调用 insert() 会抛出错误,因为堆中没有这样的方法 class。在非常相似的最小和最大堆实现之间以编程方式进行选择的最佳方法是什么?
insert
在这两种情况下似乎具有相同的签名,因此您可以将其拉到超级 class。只要签名相同,它们的实现方式是否不同并不重要。
你的堆 class 然后变成
abstract class Heap
{
size() { ... }
peek() { ... }
abstract void insert();
}
您可以将 insert() 添加到堆中 class。
我正在尝试实现一个简单的 binary heap class,用户可以在其中选择他们想要最小堆还是最大堆。
我做了超级class摘要:
abstract class Heap
{
size() { ... }
peek() { ... }
}
main 方法选择实例化 maxHeap 或 minHeap subclass。
public static void main(String[] args)
{
Heap myHeap = new minHeap();
if ( /* some condition */ )
myHeap = new maxHeap();
}
myHeap.insert(/* some value */);
插入函数在最小堆和最大堆中的实现方式不同classes:
class minHeap extends Heap
{
public void insert() { ... }
}
class maxHeap extends Heap
{
public void insert() { ... }
}
当然,从 main 调用 insert() 会抛出错误,因为堆中没有这样的方法 class。在非常相似的最小和最大堆实现之间以编程方式进行选择的最佳方法是什么?
insert
在这两种情况下似乎具有相同的签名,因此您可以将其拉到超级 class。只要签名相同,它们的实现方式是否不同并不重要。
你的堆 class 然后变成
abstract class Heap
{
size() { ... }
peek() { ... }
abstract void insert();
}
您可以将 insert() 添加到堆中 class。