从重写方法调用(非 public)方法
Calling (non public) methods from overriden method
我遇到覆盖问题(这是我相当陌生的东西),我会 post 具体解决我的问题。
我做了一个 class 扩展 ArrayList
.
我有几个关于我必须做什么和覆盖的问题。
首先,如果 ArrayList
实现并扩展了它所需要的一切,那么扩展 ArrayList
的新 class 是否也会 "automatically" 扩展并实现必要的 [=41] =]es 和接口。我很想假设是,因为我知道你只能延长一个 class.
我的第二个问题是关于覆盖。
我已经覆盖了方法 get()
来自:
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
至:
@Override
public E get(int index) {
DoSomethingWithIndex...
return elementData(index);
}
注意:我已将上面的代码包含在源代码中。 E elementData
...
虽然我没有覆盖它。
我的问题是我被告知无法找到 elementData
(我覆盖的 get 方法的 return)。我也应该覆盖它吗?是不是用ArrayList
扩展了。不明白为什么找不到。
Firstly, if ArrayList implements and extends all it needs to, will my new class which extends ArrayList also "automatically" extend and implement the necessary classes and interaces.
是的。例如,下面的 class 是完全有效的:
public class MyList extends ArrayList<String> {
// Empty!
}
无需实现任何东西或提及任何接口。
My problem is that I am told that elementData
(the return of my overwritten get method) cannot be found.
没错。 elementData
是私有的,不能在 subclasses 中访问。相反,使用
@Override
public E get(int index) {
DoSomethingWithIndex...
return super.get(index); // Delegate call to overridden method.
}
最后,扩展 ArrayList 很少是正确的做法。您应该几乎总是喜欢组合而不是继承。例如参见:
- Favor composition over inheritance
- Prefer composition over inheritance?
我不完全理解你的第二个问题,但对于第一个问题,答案是:是的。
用 ArrayList 实现的所有东西也用你的子类实现。您只需要导入要在代码中显式使用的 类,例如当您覆盖某些内容时。
您可能需要来自 Effective Java, Second Edition 的 Joshua Bloch 的建议,第 16 项:优先考虑组合而不是继承。
也就是说,不是直接扩展 ArrayList
,而是创建一个包装它的 class,它也实现了 List
。这样,您还可以避免实施中未记录的一些问题。
在该书中的示例中,HashSet
的 addAll
调用了它的 add
方法,但没有记录在案,因为它不是用继承编写的介意。
我遇到覆盖问题(这是我相当陌生的东西),我会 post 具体解决我的问题。
我做了一个 class 扩展 ArrayList
.
我有几个关于我必须做什么和覆盖的问题。
首先,如果 ArrayList
实现并扩展了它所需要的一切,那么扩展 ArrayList
的新 class 是否也会 "automatically" 扩展并实现必要的 [=41] =]es 和接口。我很想假设是,因为我知道你只能延长一个 class.
我的第二个问题是关于覆盖。
我已经覆盖了方法 get()
来自:
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
至:
@Override
public E get(int index) {
DoSomethingWithIndex...
return elementData(index);
}
注意:我已将上面的代码包含在源代码中。 E elementData
...
虽然我没有覆盖它。
我的问题是我被告知无法找到 elementData
(我覆盖的 get 方法的 return)。我也应该覆盖它吗?是不是用ArrayList
扩展了。不明白为什么找不到。
Firstly, if ArrayList implements and extends all it needs to, will my new class which extends ArrayList also "automatically" extend and implement the necessary classes and interaces.
是的。例如,下面的 class 是完全有效的:
public class MyList extends ArrayList<String> {
// Empty!
}
无需实现任何东西或提及任何接口。
My problem is that I am told that
elementData
(the return of my overwritten get method) cannot be found.
没错。 elementData
是私有的,不能在 subclasses 中访问。相反,使用
@Override
public E get(int index) {
DoSomethingWithIndex...
return super.get(index); // Delegate call to overridden method.
}
最后,扩展 ArrayList 很少是正确的做法。您应该几乎总是喜欢组合而不是继承。例如参见:
- Favor composition over inheritance
- Prefer composition over inheritance?
我不完全理解你的第二个问题,但对于第一个问题,答案是:是的。 用 ArrayList 实现的所有东西也用你的子类实现。您只需要导入要在代码中显式使用的 类,例如当您覆盖某些内容时。
您可能需要来自 Effective Java, Second Edition 的 Joshua Bloch 的建议,第 16 项:优先考虑组合而不是继承。
也就是说,不是直接扩展 ArrayList
,而是创建一个包装它的 class,它也实现了 List
。这样,您还可以避免实施中未记录的一些问题。
在该书中的示例中,HashSet
的 addAll
调用了它的 add
方法,但没有记录在案,因为它不是用继承编写的介意。