如何在不同的类类型 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,它将由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) 
        ...
    
    ...

现在创建一个父类注册表

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 类扩展到您的两个实现,即 RegistryPersonRegistryActivity

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 的相同点和不同点

在不同的类之间访问相同的方法?

如何在相同大小的类中给出不同的约束(xcode 8 AutoLayout)

如何在不同的类上使用相同的属性和方法? [复制]