我试图将ArrayList扩展为仅使add函数可用。然后我创建了一个AlExtend的对象,但除了add()之外我仍然可以访问所有其他方法。如何创建允许AlExtend对象仅使用add()函数的代码?
import java.util.ArrayList;
public class AlExtend<E> extends ArrayList<E> {
public AlExtend() {
super();
}
@Override
public boolean add(E e) {
return super.add(e);
}
}
public class main {
public static void main(String[] args) {
ALExtend<String> list = new ALExtend<String>();
list.add("fg");
list.clear();
}
}
答案 0 :(得分:5)
继承不会为您提供所需的行为。改用构图。将ArrayList
个实例设为您班级的私有成员,并仅授予其add
方法的访问权限。
import java.util.ArrayList;
public class AlExtend<E>
{
private ArrayList<E> list = new ArrayList<E> ();
public AlExtend() {
super();
}
public boolean add(E e) {
return list.add(e);
}
}
答案 1 :(得分:1)
你不能。
在OOP中,您无法通过继承来降低属性/方法的可见性。如果您希望只使用选定的方法拥有自己的List
,则最好使用委托而不是继承
答案 2 :(得分:1)
无法重写超类(或接口)可见性较低的方法。
唯一的可能性是创建新类,不实施 a java.util.List
和不延伸 ArrayList
,但只有&#34; 包含&#34;它。
仅在新类中公开方法add
,调用列表的相应方法。
public class OnlyAddList<E> {
private List<E> originalList;
public OnlyAddList(List<E> originalList) {
this.originalList = originalList);
}
public void add(E element) {
originalList.add(element);
}
}
注意:使用接口List而不是具体的类ArrayList作为参数,这样您的新类就更灵活了。使用接口而不是具体类是良好的面向对象编程实践之一。请参阅Dependency Inversion Principle
答案 3 :(得分:1)
用户委派而不是继承。
import java.util.ArrayList;
public class AlExtend<E> {
private ArrayList<E> list;
public AlExtend() {
list = new ArrayList<E>();
}
public boolean add(E e) {
return list.add(e);
}
}