如何在不同的类类型 ArrayList 中使用相同的方法?
Posted
技术标签:
【中文标题】如何在不同的类类型 ArrayList 中使用相同的方法?【英文标题】:How can I use same methods in different classes type ArrayList? 【发布时间】:2016-12-23 14:02:09 【问题描述】:我正在做一个应该存储在两个不同文本文件中的项目。假设我有 2 个类 Person 和 Activity,每个类只有以下共同属性:id 和 isActive。但也有很多不常见的。
我还有 2 个类 ArrayList 类型:
public class RegistryPerson extends ArrayList<Person>
public void add(Person obj)
....
public boolean isDuplicate(Person obj)
for(Person p: this)
if(obj.equals(p))
return true;
return false;
public Person search(int id)
....
public void readFile()
otherClass.readFile(String txtfilePerson);
public void activate(Person obj)
obj.setActivate;
//more methods
.
public class RegistryActivity extends ArrayList<Activity>
public void add(Activity obj)
....
public boolean isDuplicate(Activity obj)
for(Activity p: this)
if(obj.equals(p))
return true;
return false;
public Activity search(int id)
....
public void readFile()
otherClass.readFile(String txtfileActivity);
public void activate(Activity obj)
obj.setActivate;
//more methods
两个类的方法相同
如您所见,ArrayList RegitryPerson 和 RegistryActivigy 两个类类型具有相同的方法,但有些使用了不同类型的对象。
我只是不想在不同的类中使用几乎相同的代码。我可以使用接口或抽象类吗?最重要的是,如何实现?还是我把一切都复杂化了?
谢谢。
【问题讨论】:
强烈建议您不要扩展 ArrayList。只需将 List 作为类的实例变量即可。 @puhlen 谢谢.. 你能提供更多信息吗? 【参考方案1】:您可以在这里遵循Program to an interface, not implementations的设计原则。
创建一个interface
,比如Entity
,它将由Person
和Activity
实现
Entity.java
public interface Entity
public Boolean equals(Entity e);
//other common methods
这个接口将由Person
和Activity
实现
Person.java
public class Person implements Entity
...
@Override
public boolean equals(Entity e)
...
...
Activity.java
public class Activity implements Entity
...
@Override
public boolean equals(Entity e)
...
...
现在创建一个父类注册表
Registry.java
public class Registry extends ArrayList<Entity>
public void add(Entity obj)
....
public boolean isDuplicate(Entity obj)
for(Entity p: this)
if(obj.equals(p))
return true;
return false;
public Entity search(int id)
....
public void readFile()
otherClass.readFile(String txtfilePerson);
public void activate(Entity obj)
obj.setActivate;
//more methods
现在您可以将此 Registry 类扩展到您的两个实现,即 RegistryPerson
和 RegistryActivity
RegistryPerson.java
public class RegistryPerson extends Registry
..
RegistryActivity.java
public class RegistryActivity extends Registry
..
P.S.:上面列出的所有类都包含更常用的方法。这只是给你这个设计原则的基本介绍。
【讨论】:
谢谢@rD。这正是我想要的,当然你可以改进很多东西,但要循序渐进。【参考方案2】:我和 rD 有同样的想法,但使用泛型来创建注册表。我还在课堂内移动了列表。从文件读取和添加注册表的方法可以由其他类处理。我尝试不惜一切代价避免继承和抽象类。接口是泛型,非常强大。
interface IdObject
int getId();
class Registry<T extends IdObject>
private List<T> list = new ArrayList<T>();
public void add(T obj)
list.add(obj);
public boolean isDuplicate(T obj)
for(T t: list)
if(obj.equals(t))
return true;
return false;
public T search(int id)
for(T t: list)
if(t.getId() == id))
return t;
return null;
class Example
Registery<Person> personRegistery = new Registry<>();
Registery<Activity> activityRegistery = new Registry<>();
【讨论】:
加 1 表示优先组合而不是继承,而不是使注册表成为 arraylist 的子类! 同意@GhostCat - 组合而不是继承是 OP 出错的地方。以上是关于如何在不同的类类型 ArrayList 中使用相同的方法?的主要内容,如果未能解决你的问题,请参考以下文章
Java - 如何使 ArrayList 访问不同的类方法?
当我使用 ArrayList 时,如何防止 GWT 尝试包含每个可序列化的类
ArrayList,LinkList,Vactor 的相同点和不同点