你好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 addAll()爲每個元素調用本地ArrayList添加。
ArrayCount add()調用其父級的add(),然後遞增計數。 ArrayCount addAll()調用其父級的addAll(),然後通過元素數遞增計數。
現在正在發生突變。在基類代碼的註釋行更改爲以下:
public void addAll(Object elements[])
{
for (int i = 0; i < elements.length; ++i)
add(elements[i]); // this line was changed
}
現在ArrayCount中的addAll()調用其父中的addAll(),它在內部調用的add()已被重寫的派生類。
Derived類的作者必須知道Base類是如何實現的。他們必須被告知Base類中的每一個變化,因爲它可能以不可預知的方式破壞他們的Derived類。
我正在尋找一種正確的方式來實現這一點,將尊重黑盒編程概念。因爲這個例子迫使派生類的編寫者知道基類是如何實現的並且知道每一個變化
基類中的更改通過將調用虛擬化並將實現委託給派生類來顯式更改合約。你的問題不清楚。 –
有沒有辦法做什麼?請澄清您的需求 –
確實不清楚。我編輯了這個句子 –