首页 > 解决方案 > 通过 Java 中的接口传递设置 - 可能吗?

问题描述

假设我有两个班级。

public class Banana extends Fruit{    
    public Banana() {
        this.setTitle("Banana");
        this.setSize("Medium");
        this.setState("Rotten");
    }
}
public class Sausage extends Meat{    
    public Sausage() {
        this.setTitle("Sausage");
        this.setSize("Medium");
        this.setState("Rotten");
    }
}

有没有办法引入一个可以保存通用设置的接口(可能使用默认方法)?两个原始扩展都应该保留。

我已经用谷歌搜索了大约一个小时的接口和默认方法,并在 Java 聊天服务器上询问了这个问题,但我仍然感到困惑。

标签: javajava-8interface

解决方案


你不能直接这样做。我认为您在这里基本上要求的是多重继承,而这个概念似乎给 Java 语言设计者带来了严重的轻率。你可以自己实现类似的东西。

假设你有一个接口Food

public interface Food {    
    void setTitle(String s);
    void setSize(String s);
    void setState(String s);
}

然后你可以这样做:

public class BaseFood implements Food {  
    private String title;  
    private String size;  
    private String state;  
    // setters and getters...
}

然后这个:

public class Banana extends Fruit implements Food {    
    private BaseFood food = new Food();
    public Banana() {
        food.setTitle("Banana");
        food.setSize("Medium");
        food.setState("Rotten");
    }
}

为了完整起见,这里是Sausage,它与 基本相同Banana

public class Sausage extends Meat implements Food {    
    private BaseFood food = new Food();
    public Sausage() {
        food.setTitle("Kielbasa");
        food.setSize("Medium");
        food.setState("Tasty");
    }
}

这称为“委托”,您将 Java 中某个接口的实现委托给另一个对象,只声明它实现了一个公共接口,然后只调用实际实现该接口的私有实例上的方法。它基本上是手动多重继承。

我的 IDE (NetBeans) 会为我完成大部分工作,这很常见。给定一个接口和一个实现该接口的私有实例成员,它将编写公开实现该接口所需的所有方法。它工作正常,但可以生成很多样板。我有点希望 Java 人员至少能在语言中为“多重继承问题”提供部分解决方案。

编辑:你说没有共同的基类,但后来你说:

在这种情况下,您不能创建基类,因为它是具有单一继承的 Java——而且 Sausage 和 Banana 都已经在扩展某些东西。除非我错过了你能看到的东西......

如果可以更改继承,则可以创建一个通用基类:

class Food { ...
class Fruit extends Food {...
class Banana extends Fruit {...
class Meat extends Food {...
class Sausage extends Meat { ...

但是我的回答假设您出于任何原因都不能这样做。


推荐阅读