如何在不同的 类 类型的 ArrayList 中使用相同的方法?

How can I use same methods in different classes type ArrayList?

我正在做一个应该存储在两个不同文本文件中的项目。假设我有 2 个 classes Person 和 Activity,每个人只有这些共同的属性:id 和 isActive。但也有很多不常见的。

我还有 2 个 classes 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
}

两者 class 具有相同的方法

如您所见,class类型的 ArrayList RegitryPerson 和 RegistryActivigy 具有相同的方法,但有些使用不同类型的对象。

我只是不想在不同的 classes 中使用几乎相同的代码。我可以使用接口或抽象 class 吗?最重要的是,如何实施?还是我把一切都复杂化了?

谢谢。

您可以在这里遵循Program to an interface, not implementations设计原则。

创建一个 interface say Entity 将由 PersonActivity

实现

Entity.java

public interface Entity {
    public Boolean equals(Entity e);
    //other common methods
}

此接口将由 PersonActivity

实现

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) {
        ...
    }
    ...
}

现在创建父 Class 注册表

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
}

现在您可以将此注册表 class 扩展到您的两个实现,即 RegistryPersonRegistryActivity

注册表Person.java

public class RegistryPerson extends Registry {
    ..
}

注册表Activity.java

public class RegistryActivity extends Registry {
    ..
}

P.S.: 上面列出的所有 classes 都包含更常用的方法。这里只是简单介绍一下这个设计原理。

我的想法与 rD 相同,但使用泛型来创建注册表。我还将列表移动到 class 内。读取文件和添加注册表的方法可以由其他 classes 处理。我尽量避免继承和抽象 classes 不惜一切代价。接口是泛型,非常强大。

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<>();
}