【发布时间】:2016-08-05 15:44:12
【问题描述】:
你好 Stackoverflowers,
想象一下下面的基类
import java.util.ArrayList;
public class Array
{
private ArrayList<Object> a = new ArrayList<Object>();
public void add(Object element)
{
a.add(element);
}
public void addAll(Object elements[])
{
for (int i = 0; i < elements.length; ++i)
a.add(elements[i]); // this line is going to be changed
}
}
这是派生类:
public class ArrayCount extends Array
{
private int count = 0;
@Override
public void add(Object element)
{
super.add(element);
++count;
}
@Override
public void addAll(Object elements[])
{
super.addAll(elements);
count += elements.length;
}
}
Array add() 将元素添加到本地 ArrayList。 Array addAll() 为每个元素调用本地 ArrayList add。
ArrayCount add() 调用其父级的 add() 然后递增计数。 ArrayCount addAll() 调用其父级的 addAll(),然后将计数增加元素数。
现在进行重大更改。 Base 类中的注释代码行更改为:
public void addAll(Object elements[])
{
for (int i = 0; i < elements.length; ++i)
add(elements[i]); // this line was changed
}
现在 ArrayCount addAll() 调用其父级的 addAll() 内部调用已被 Derived 类覆盖的 add()。
Derived 类的作者必须知道 Base 类是如何实现的。并且必须告知他们 Base 类的每一个变化,因为它可能会以不可预知的方式破坏他们的 Derived 类。
我正在寻找一种尊重黑盒编程概念的正确方法来实现这一点。因为这个例子迫使派生类的编写者知道基类是如何实现的,并且知道每一个变化
【问题讨论】:
-
基类中的更改通过使调用虚拟化并将实现委托给派生类来显式更改合同。您的问题不清楚。
-
有什么办法吗?请说明您的需求
-
确实不清楚。我编辑了句子
标签: java oop inheritance