有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

类为两个不在java中使用继承的类创建公共方法

我只是想知道是否有任何方法可以创建两个不相关但具有相同方法实现的类。我知道有接口和静态方法,但它们似乎只有在类中有静态字段时才有用。当方法使用特定于精确对象的字段时,这是否可能做到这一点? 我知道写这样的代码是一种糟糕的做法,但我只是好奇

编辑: 我的意思是这样的:

public class Person implements MakingOlder {
  private int age;
}

public class Cat implements MakingOlder {
  private int age;
}

public interface MakingOlder {
  public static void makeOlder() {
        this.age += 2;
  }
}

我不想为Person和Cat创建公共基类,接口不起作用。我试图避免两次编写同一个实现并复制代码


共 (3) 个答案

  1. # 1 楼答案

    。。。或者可以在Java 8+中使用默认实现

    public interface MakingOlder {
    
        public default void makeOlder() {
            setAge(getAge() + 2);
        }
    
        int getAge();
    
        void setAge(int age);
    
    }
    

    当然,你的人和猫实现了MakingOlder

  2. # 2 楼答案

    您的接口可能无法工作,因为您试图在接口中实现一个方法:

    public static void makeOlder() {
        this.age += 2;
    }
    

    为了使其工作,请尝试添加default关键字,使其看起来像:

    default Integer makeOlder(Integer age) {
        age += 2;
        return age;
    }
    

    然后,实现该接口的类只需要包含以下内容:

    public class Dummy implements AA {
    
        Integer age;
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    

    要测试结果,可以调用以下命令:

    Dummy d = new Dummy();
    d.setAge(d.makeOlder(7));
    System.out.println(d.getAge());
    d.setAge(d.makeOlder(d.getAge()));
    System.out.println(d.getAge());
    
  3. # 3 楼答案

    当然,这被称为“组合+委派”,用以下方式取代继承通常是一种好的做法:

    https://en.wikipedia.org/wiki/Composition_over_inheritance

    public class Person implements AgingObject {
      private int age;  
      private AgingBehavior agingBehavior;
    
      void makeOlder() {
        agingBehavior.makeOlder(this);
      }
      //(...)
    }
    
    public class Cat implements AgingObject {
      private int age;
      private AgingBehavior agingBehavior;
    
      void makeOlder() {
        agingBehavior.makeOlder(this);
      }
      //(...)
    }
    
    public class AgingBehavior {
      void makeOlder(AgingObject agingObject) {
        agingObject.setAge(agingObject.getAge() + 2);
      }
    }
    
    public interface AgingObject {
        int getAge();
        void setAge(int age);
    }