如何在不同的 类 类型的 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
将由 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) {
...
}
...
}
现在创建父 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 扩展到您的两个实现,即 RegistryPerson
和 RegistryActivity
注册表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<>();
}
我正在做一个应该存储在两个不同文本文件中的项目。假设我有 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
将由 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) {
...
}
...
}
现在创建父 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 扩展到您的两个实现,即 RegistryPerson
和 RegistryActivity
注册表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<>();
}